继承 (Inheritance) 是面向对象语言中的重要特征之一。
在 C# 语言中仅支持单重继承,主要用于解决代码的重用问题。
为了将继承关系灵活运地用到程序设计中,在 C# 语言中提供了接口来解决多重继承的关系。
在编程中灵活地使用类之间的继承关系能很好地实现类中成员的重用,有利于类的使用。
- C# 继承的特点
派生类是对基类的扩展,派生类可以添加新的成员,但不能移除已经继承的成员的定义。
继承是可以传递的。如果 C 从 B 中派生,B 又从 A 中派生,那么 C 不仅继承了 B 中声明的成员,同样也继承了 A 中声明的成员。
构造函数和析构函数不能被继承,除此之外其他成员能被继承。基类中成员的访问方式只能决定派生类能否访问它们。
派生类如果定义了与继承而来的成员同名的新成员,那么就可以覆盖已继承的成员,但这并不是删除了这些成员,只是不能再访问这些成员。
类可以定义虚方法、虚属性及虚索引指示器,它的派生类能够重载这些成员,从而使类可以展示出多态性。
派生类只能从一个类中继承,可以通过接口来实现多重继承。
-
base 在继承的关系中,子类如果需要调用父类中的成员可以借助 base 关键字来完成
-
virtual 是虚拟的含义,在 C# 语言中,默认情况下类中的成员都是非虚拟的,
通常将类中的成员定义成虚拟的,表示这些成员将会在继承后重写其中的内容。
virtual 关键字能修饰方法、属性、索引器以及事件等,用到父类的成员中。 -
abstract 关键字代表的是抽象的,
使用该关键字能修饰类和方法,修饰的方法被称为抽象方法、修饰的类被称为抽象类。
抽象方法是一种不带方法体的方法,仅包含方法的定义
通常抽象类会被其他类继承,并重写其中的抽象方法或者虚方法。 -
sealed 关键字的含义是密封的,使用该关键字能修饰类或者类中的方法,
修饰的类被称为密封类、修饰的方法被称为密封方法。
但是密封方法必须出现在子类中,并且是子类重写的父类方法,
即 sealed 关键字必须与 override 关键字一起使用。
密封类不能被继承,密封方法不能被重写。
//C# 继承 base Virual Abstract Sealed 相关
//Object 四个主要方法: Equals/GetHashCode/GetType/ToString
static void Main(string[] args)
{
TestBase();
}
static void TestBase()
{
//Person person = new Person();//虚方法不能实例化
//Console.WriteLine("Person类的Print方法打印内容");
//person.Print();
Student student = new Student();
Console.WriteLine("Student类的Print方法打印内容");
student.Print();
Teacher teacher = new Teacher();
Console.WriteLine("Teacher类的Print方法打印内容");
teacher.Print();
}
abstract class Person
{
public Person(string name)
{
this.Name = name;
}
public int Id { get; set; }
public string Name { get; set; }
public virtual void Print()
{
Console.WriteLine("编号:" + Id);
Console.WriteLine("姓名:" + Name);
}
public abstract void ShowMyInfo();//在各自子类中实现自己的实现方法
}
class Teacher : Person
{
public Teacher(string name) : base(name)
{
}
public string Title { get; set; }
public string WageNo { get; set; }
public override void Print()
{
base.Print();
Console.WriteLine("职称:" + Title);
Console.WriteLine("工资号:" + WageNo);
}
public sealed override void ShowMyInfo() => (this.Name + ":" + this.WageNo).Dump();
}
sealed class Student : Person
{
public Student(string name) : base(name)
{
}
public string Major { get; set; }
public string Grade { get; set; }
public override void Print()
{
base.Print();
Console.WriteLine("专业:" + Major);
Console.WriteLine("年级:" + Grade);
}
public override void ShowMyInfo() => (this.Name + "-" + this.Major).Dump();
}
此示例中实现了对类的继承各种方式的使用.
本文作者:wwmin
微信公众号: DotNet技术说
本文链接:https://www.jianshu.com/p/85cb352b4ca5
关于博主:评论和私信会在第一时间回复。或者[直接私信]我。
版权声明:转载请注明出处!
声援博主:如果您觉得文章对您有帮助,关注点赞, 您的鼓励是博主的最大动力!
网友评论