C#入门系列 -- 面向对象之多态
【摘要】 基础概念同一操作作用于不同类的实例、不同的类型将进行不同的解释,产生不同的结果,即为多态。C#可以通过继承实现多态性,实现的办法为:对基类的成员进行隐藏或覆盖。 隐藏基类的成员C#规定派生类不能删除它继承的任何成员,但是在派生类中可以隐藏从基类继承的成员,基类的静态成员也可以被派生类隐藏。要隐藏一个基类的成员需做到如下两点:对于数据成员来说,需要声明一个新的相同类型的成员,并使用相同的名称...
基础概念
同一操作作用于不同类的实例、不同的类型将进行不同的解释,产生不同的结果,即为多态。
C#可以通过继承实现多态性,实现的办法为:对基类的成员进行隐藏或覆盖。
隐藏基类的成员
C#规定派生类不能删除它继承的任何成员,但是在派生类中可以隐藏从基类继承的成员,基类的静态成员也可以被派生类隐藏。
要隐藏一个基类的成员需做到如下两点:
- 对于数据成员来说,需要声明一个新的相同类型的成员,并使用相同的名称;对于函数成员来说,需要声明新的带有相同签名的函数成员;
- 在派生类中声明用来隐藏基类成员的同名成员时需要使用new修饰符。
代码示例:
public void Show()
{
Console.WriteLine("基类 Show");
}
则在派生类 Cat 中定义隐藏方法的代码为:
new public void Show()
{
Console.WriteLine("派生类 Show");
}
覆盖基类的成员
如果有一个派生类对象的引用,使用类型转换运算符把该引用转换成基类类型,就可以获取该对象基类部分的引用,
格式如下所示:
(基类名) 派生类对象名;
将派生类对象的引用转换成基类引用来访问派生类对象时,得到的是基类的成员。
虚方法提供了使基类引用访问“升至”派生类内的方法。虚方法即为使用关键字virtual声明的实例方法;没有使用关键字virtual声明的方法称为非虚方法。
借助虚方法使得基类引用调用派生类的方法需要满足下列条件:
- 派生类的方法和基类的方法具有相同的方法签名和返回类型;
- 基类的方法必须使用virtual声明为虚方法;
- 派生类的方法需要使用override标注为覆写方法。
使用虚方法和覆写方法时还需注意:
- 虚方法和覆写方法必须具有相同的可访问性;
- 不能覆写静态方法和非虚方法;
- 方法、属性、索引以及事件都可以使用virtual和override进行声明和覆写;
- 覆写方法可以出现在继承的任意层次上。
virtual 和 abstract
virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义。
- virtual修饰的方法必须有实现(哪怕是仅仅添加一对大括号),而abstract修饰的方法一定不能实现。
- virtual可以被子类重写,而abstract必须被子类重写。
- 如果类成员被abstract修饰,则该类前必须添加abstract,因为只有抽象类才可以有抽象方法。
- 无法创建abstract类的实例,只能被继承无法实例化。
重载和重写:
- 重载(overload)是提供了一种机制, 相同函数名通过不同的返回值类型以及参数来表来区分的机制。
- 重写(override):是用于重写基类的虚方法,这样在派生类中提供一个新的方法。
多态代码示例
class Program
{
static void Main(string[] args)
{
// 多态的实现前提是继承和方法重写,基类可以new所有的派生类
// new哪个类 他就执行那个类的方法
// 实例Person类
Person person = new Person();
// 实例Student类
Person student = new Student();
// 实例Teacher类
Person teacher = new Teacher();
person.Show(); // 调用Person类的Show方法
student.Show(); // 实例Student类
teacher.Show(); // 实例Teacher类
Console.ReadLine();
}
}
class Person
{
public virtual void Show()
{
Console.WriteLine("这是Person的Show方法");
}
}
class Student : Person
{
public override void Show()
{
Console.WriteLine("这是Student的Show方法");
}
}
class Teacher : Person
{
public override void Show()
{
Console.WriteLine("这是Teacher的Show方法");
}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)