美文网首页
C#基础之继承与多态

C#基础之继承与多态

作者: 狼之独步 | 来源:发表于2016-09-28 17:27 被阅读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;
}

相关文章

  • C#基础之继承与多态

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

  • Unity 面试题汇总(一)

    C#语言基础 1.重载和重写的区别 1) 封装、继承、多态所处位置不同,重载在同类中,重写在父子类中。 ...

  • 设计模式总结

    1、模式依赖基础与原则 1.1、基础 抽象,封装,多态,继承 1.2、原则 封装变化,多用组合、少用继承,针对接口...

  • java多态

    概述 面向对线的四个基本特征:抽象,封装,基础,多态。抽象,封装,继承是多态的基础,多态是抽象,封装,继承的表现 ...

  • Unity C#继承与多态

    父类——道具 子类——继承道具 其中 子类重写了父类中的碰撞检测函数,并且新加了一个MP字段和一个print1的新...

  • 学习路线

    Java Se基础 Java基础语法、数组、类与对象、继承与多态、异常、范型、集合、流与文件、反射、枚举、自动装箱...

  • Java的基本特性

    关系 Java的四个基本特性分别是抽象,封装,继承,多态。概括起来可以这么理解,抽象、封装、继承是多态的基础,多态...

  • 面向对象

    继承与多态

  • java基础概念

    java_basic 介绍 java基础 三大特性之—封装 三大特性之—继承 三大特性之—多态 抽象 接口 深拷贝...

  • Java_basic_10: 多态polymorphism

    多态polymorphism 多态是指对象的多种形态 主要可以分为引用多态和方法多态 继承是多态的实现基础 引用多...

网友评论

      本文标题:C#基础之继承与多态

      本文链接:https://www.haomeiwen.com/subject/idxkyttx.html