C#基础之继承与多态

2016-09-28  本文已影响0人  狼之独步

C# 只允许单一继承。多重继承可以通过接口达到。
例子:
class Parent
{
}
class Child : Parent

虚函数
虚函数在 C# 中同样是用于实现多态的概念的,除了你要使用 override 关键字在子类中实现虚函数外。父类使用同样的 virtual 关键字。每个重写虚函数的类都使用 override 关键字。(译注:作者所说的“同样”,“除......外”都是针对 C# 和 C++ 而言的)

class Shape{
public virtual void Draw()
{
Console.WriteLine("Shape.Draw") ;
}
}
class Rectangle : Shape
{
public override void Draw()
{
Console.WriteLine("Rectangle.Draw");
}
}
class Square : Rectangle
{
public override void Draw()
{
Console.WriteLine("Square.Draw");
}
}
class MainClass{
static void Main(string[] args) {
Shape[] shp = new Shape[3];

Rectangle rect = new Rectangle();
shp[0] = new Shape();
shp[1] = rect;
shp[2] = new Square();
shp[0].Draw();
shp[1].Draw();
shp[2].Draw();
}
}

Output:
使用“new”隐藏父类函数
你可以隐藏基类中的函数而在子类中定义其新版本。关键字 new 用于声明新的版本。思考下面的例子,该例是上一例子的修改版本。注意输出,我用 关键字 new 替换了 Rectangle 类中的关键字 override。

Shape.DrawRectangle.DrawSquare.Draw

class Shape{
public virtual void Draw()
{

Console.WriteLine("Shape.Draw") ;
}
}
class Rectangle : Shape
{
public new void Draw()
{
Console.WriteLine("Rectangle.Draw");
}
}class Square : Rectangle
{
//这里不用
override public new void Draw()
{
Console.WriteLine("Square.Draw");
}

}
class MainClass{
static void Main(string[] args)
{
Console.WriteLine("Using Polymorphism:");
Shape[] shp = new Shape[3];
Rectangle rect = new Rectangle();
shp[0] = new Shape();
shp[1] = rect;
shp[2] = new Square();
shp[0].Draw();
shp[1].Draw();
shp[2].Draw();
Console.WriteLine("Using without Polymorphism:");
rect.Draw();
Square sqr = new Square();
sqr.Draw();
}}

Output:
多态性认为 Rectangle 类的 Draw 方法是和 Shape 类的 Draw 方法不同的另一个方法,而不是认为是其多态实现。所以为了防止父类和子类间的命名冲突,我们只有使用 new 修饰符。
注意:你不能在一个类中使用一个方法的两个版本,一个用 new 修饰符,另一个用 override 或 virtual。就像在上面的例子中,我不能在 Rectangle 类中增加另一个名为 Draw 的方法,因为它是一个 virtual 或 override 的方法。同样在Square 类中,我也不能重写 Shape 类的虚方法 Draw。
调用基类成员
如果子类的数据成员和基类中的有同样的名字,为了避免命名冲突,基类

Using PolymorphismShape.DrawShape.DrawShape.Draw
Using without Polymorphism:Rectangle.DrawSquare.Draw

和函数使用 base 关键字进行访问。看看下面的例子,基类构造函数是如何调
用的,而数据成员又是如何使用的。
OR

public Child(int val) :base(val)
{
myVar = 5;
base.myVar;
}

public Child(int val)
{
base(val);
myVar = 5 ;
base.myVar;
}

上一篇 下一篇

猜你喜欢

热点阅读