一、类继承
- 通过类继承可以定义一个新类,新类纳入一个已经声明的类进行扩展
- 已经存在的类叫做基类,而通过继承出的类叫做派生类,派生类的组成为:
- 本身声明中的成员
- 基类的成员
- 派生类无法删除基类成员,但可以屏蔽,可以扩展自身方法和变量
- 格式: class OtherClass :SomeClass
- OtherClass 是派生类,而SomeClass 是基类
- 代码示例:
using System; namespace Derived_Class { class SomeClass { public int x = 10; public string y = "This is father"; public void Display() { Console.WriteLine($"{y} and x : {x} "); } } class OtherClass : SomeClass { private string s = "This is son"; public void Displays() { Console.WriteLine($"{s} and x : {x}"); } } class Program { static void Main(string[] args) { SomeClass ax=new SomeClass(); //基类 OtherClass bx=new OtherClass(); //派生类 ax.Display(); bx.Displays(); } } }
二、屏蔽基类成员
- 虽然派生类无法删除基类成员,但是可以屏蔽基类成员,使用new以及相同名称可以屏蔽基类成员,这是继承的基本功能之一,例如我们使用一个方法,但是这个方法适用于基类而非派生类,那么就需要来屏蔽基类成员
- 格式:使用关键词 new 来使基类 变量/方法 被屏蔽
Class OtherClass { new private int x=11; ··· }
- 代码示例
using System; namespace Derived_Class { class SomeClass { public int x = 10; public string y = "This is father"; public void Display() { Console.WriteLine($"{y} and x : {x} "); } } class PrimClass : SomeClass { new private string y = "This is other son"; //基类屏蔽 new private int x = 29; //基类屏蔽 private int z = 30; new public void Display() { Console.WriteLine($"{y} and x : {x} "); } } class Program { static void Main(string[] args) { SomeClass ax=new SomeClass(); //基类 PrimClass cx = new PrimClass(); //派生类,屏蔽了基类方法和变量 ax.Display(); cx.Display(); } } }
基类访问
- 如果派生类必须访问被隐藏的基类成员,那么可以使用基类访问,由关键词 base 后面加一个 “ . ” 来实现
- 代码示例:
class PrimClass : SomeClass { new private string y = "This is other son"; //基类屏蔽 new private int x = 29; //基类屏蔽 private int z = 30; new public void Display() { Console.WriteLine($"{y} and x : {x} "); Console.WriteLine($"base.y {base.y} and base.x: {base.x} "); //基类访问 } }
基类引用
- 若要使用派生类的基类部分,这时候就要用到基类的引用
- 格式:
OtherClass md= new OtherClass(); BaseClass mc = (BaseClass) md;
- 上述 mc 就可以访问 md 的基类部分
- 除此之外 mc 和 md 访问的位置是一样的,如果对 mc 进行修改,那么 md 的基类部分也会进行修改
- mc 是无法看到 md 的派生类部分的
虚方法和覆写方法
- 在上一节我们看到,当使用基类引用访问派生类对象时,得到的是基类的成员。虚方法可以使基类的引用访问“升至”派生类内
- 可以使用基类引用调用派生类的方法,只需满足下面的条件。
- 派生类的方法和基类的方法有相同的签名和返回类型。
- 基类的方法使用virtual标注。
- 派生类的方法使用override标注。
- 下面的代码展示了基类方法和派生类方法的virtual及oeride修饰符。
using System; namespace UsingOverrideVirtual { class MyBaseClass { private int val = 5; virtual public int MyProperty { get { return val; } } } class MySecondClass : MyBaseClass { private int val = 10; public override int MyProperty { get { return val; } } } class Program { static void Main(string[] args) { MySecondClass mc = new MySecondClass(); MyBaseClass md = (MyBaseClass)mc; Console.WriteLine($" {mc.MyProperty} "); Console.WriteLine($" {md.MyProperty} "); } } }