曾英-C#教学-40 向下转换 as 定义接口
目录
- 掌握基类转换为派生类向下类型的转换
- 掌握as运算符的用法
- 如何定义和使用接口
1/向下类型转换
- 派生类转换为基类即向上类型的转换
- 基类转换为派生类即向下类型的转换
- 普通方法与虚方法的区别就是两者在继承中实现的区别.
- 普通方法在继承中无法继承调用
- 继承方法这可以继承调用
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _40_向上类型转换 { class Program { static void Main(string[] args) { B b = new B(); //这里经过转换以后并不是完全的类型转换 //这个步骤不能少 A a = b;//基类=派生类,这里派生类b赋值给基类a这里是向下类型的转换 //这里的a还不是完全的转化成b类,但可以用b类中的虚方法 a.word();//这里的a类已经是继承b类的了 //输出结果:B1,调用的是b类中的虚方法 /*--------------------------------------------------------------------*/ if (a is B)//这里并没有完全相等,但是这里是返回的true { B b1 = (B)a; //强制转换a,将具有基类与派生类属的a完全转化换成B类 b1.wordB();//经过强制类型转换后的b1就可以调用B类中的方法了. } } } class A { public void wordA() { Console.WriteLine("A");} //基类虚方法 public virtual void word() { Console.WriteLine("A1"); } } //继承 class B : A { //定义了与类名相同的方法 public void wordB() { Console.WriteLine("B"); } //重写word虚方法,自己也是虚方法 public override void word() { Console.WriteLine("B1"); } } } //输出:B1
2/as运算符
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _40_向上类型转换 { class Program { static void Main(string[] args) { B b = new B(); A a = b; B b1 = a as B;//a转化为B类的对象 //这是一个安全的转化 //这里如果不能转化,则返回值是空,如果能转化,则b1=a=new B(); if (b1 != null) b1.wordB(); //输出结果:B } } class A { public void wordA() { Console.WriteLine("A");} //基类虚方法 public virtual void word() { Console.WriteLine("A1"); } } //继承 class B : A { //定义了与类名相同的方法 public void wordB() { Console.WriteLine("B"); } //重写word虚方法,自己也是虚方法 public override void word() { Console.WriteLine("B1"); } } }
3/接口
- 接口是为大家制定了一个规范.
3.1 接口的定义
- 命名的时候首字母要用大写的I.
- 接口在添加新项中添加一个新的接口文档
- 接口在定义的时候没有方法体,只有方法的名称
- 方法定义的都是公用的属性或者方法
程序实例:
主函数: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _40_接口 { class Program { static void Main(string[] args) { //前面用到类,后面用到类的构造函数 //一个接口,多个方法的实现.多态的实现. IBankeAccount myAccount = new SaverAccount(); //接口的对象可以调用类中的普通方法,不需要强制转换. myAccount.PayIn(1000); //取钱 myAccount.WithShowMyself(200); Console.WriteLine("余额:" + myAccount.Balance); } } //银行账户类 //这里要继承接口 //这里要使用并重写接口 class SaverAccount : IBankeAccount { private decimal balance; //存钱方法的重写 public void PayIn(decimal amount) {balance += amount;} //取钱的方法重写 public bool WithShowMyself(decimal amount) { //设立安全点 if (balance >= amount) { balance -= amount; return true; } else { Console.WriteLine("余额不足"); return false; } } //显示余额的属性重写 public decimal Balance { get { return balance;} } } } 接口定义: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _40_接口 { interface IBankeAccount { //存钱,接口中的方法没有用到public,但是永远都是公用的. void PayIn(decimal amount); //取钱,也没有用到方法体 bool WithShowMyself(decimal amount); //余额 decimal Balance { get; }//只读的属性 } }