您的位置:首页 > 编程语言 > C#

C# 面向对象(多态)

2017-07-25 18:11 169 查看
在类的继承中,c#允许在基类与派生类中声明具有同名的方法,而且同名的方法可以有不同的代码,也就是说在基类与派生类的相同功能中有不同的事项方法,从而为解决同一问题提供多种途径。

多态性就是指在程序运行时,执行的虽然是一个调用方法的语句,去可以根据派生类对象的类型不同完成方法不同的具体体现。

多态的出现提高了代码复用性,扩展性,使后期维护更加方便。

多态的弊端:前期定义的内容不能使用(调用)后期子类中的特有内容

使用多态的前提:
1.想让一个事物具备另一种形态,一定有继承关系(实现)
2.要有覆盖。操作父类型。

多态中的成员
Fu f=new Zi();
f.show;
变量:
父类形指向子类对象,调用的是父类的变量
编译时:参考变量的类型中是否有调用的成员变量,如果有就通过编译,没有就报错
运行时:参考变量的类型中是否有调用成员变量,如果没有就运行该类中的变量
简单说:编译和运行都看等号左边。
方法:
编译时:参考靠变量类型中是否有调用成员变量,如果有就通过编译,没有就报错
运行时:参考对象中是否有调用的函数,如果有就调用,如有没有也会调用(父类)
简单说:编译看左边,运行看右边。

C#中可以通过多种途径实现多态性:
A. 虚方法:将父类方法标记为虚方法,(使用关键字virtual),此方法在子类中可以重写(使用关键字 override)
B.抽象类与抽象方法:如果我们不需要使用父类创建对象,他的存在只是为供子类继承。可以将父类写成抽象(关键字abstract)类,将父类方法写成抽象方法,子类中的方法仍用关键字override 重写。
C. 接口实现:

我们选择使用虚方法实现多态还是抽象写抽象方法实现多态,取决于我们是否使用基类实例化的对象
抽象类:不需要使用基类实例化的对象(利用抽象来实现,类抽象化,方法抽象化,并且方法中不能有方法体{})
虚方法:需要使用基类实例化的对象

namespace 多态 { //定义抽象类 abstractclass Vertebrata { //定义抽象函数:绘图 public abstract void DrawSelf(); }class Zhu : Vertebrata { public override void DrawSelf() {Console.WriteLine(@"
╭︿︿︿╮ {/ o o /} ( (oo) ) ︶︶︶"); } } classQingWa : Vertebrata { public override void DrawSelf() {Console.WriteLine(@" @..@ (\--/) (.>__<.) ^^^^^^^^"); } }class Program { static void Main(string[] args) {//声明一个基类Vertebrata类型的数组 Vertebrata[] animals = new Vertebrata[2];//定义派生类,并存储到数组
animals[0] = new Zhu(); animals[1] = new QingWa();//使用统一的方法进行调用 foreach (Vertebrata someone in animals) {//无论是什么动物,都使用相同的语句处理 someone.DrawSelf(); } } } }

is运算符
is运算符通常用于判断某个对象是不是某种类型。
//假设Human继承自Vertebrata Humanjean=new Human(); Vertebrata someone=jean; if(someone is Human){Console.WriteLine("someone is Human"); } if(someone is Vertebrata){Console.WriteLine("someone
is Vertebrata"); }

向上转型
由低层次类型转换为高层次类型,称为向上类型转换。向上类型转换是自动进行的,比如把int类型变量赋值给long类型变量,把long类型赋值给double型变量,转换都是自动进行的。
由派生类转换为基类,也是向上转换,但基类的引用符不能引用派对生类对象特有的函数。
//假设基类Vertebrata中无work方法,在Human类中定义了work方法 Humanjean =new Human(); Vertebrata someone =jean; //这个地方是错误的.someone.Work();

向下转型
由基类向派生类转换的过程称为向下转换,在这个过程中,需要进行强制转换,同时也可以使用关键字as.

Human jean=new Human(); Vertebratasomeone=jean; if(someone is Human){ Human people =(Human)someone;//强制转换 people.Work(); }
注意:
*只有由基类向派生类转换时,才能强制向下转换,否则程序会抛出异常,所以转换之前 我们使用is运算符进行检查。
Human jean=new Human(); Vertebratasomeone=jean; Human people =someone as Human; //as 运算符if(people!=null){ people.Work(); }

一个常见的错误:Program has more than one entry point defined. Compile with/main to specify
the type that contains the entrypoint.
项目有多个入口点的定义。编译/主要指定类型,其中包含的入口点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: