继承特点:
1、类只能继承一个类,不能多继承;
2、可以继承基类中所有的方法、属性;
3、所有类继承Object类;
//C#中继承的语法为 class ChildClass:ParentClass//冒号很重要 { } //C#中只可以单继承,继承一个类,不能继承多个类
隐藏方式:
1、屏蔽数据成员:在派生类中声明名称和类型相同的成员;
2、屏蔽函数(方法)成员:在派生类中声明新的带有相同函数签名的成员;
3、让编译器知道:可以添加New关键字,否则会有警告。
- 虚方法和多态
编程原则:依赖倒置原则。即程序设计要依赖抽象类,而不依赖具体类。
虚方法 :声明为vitual的方法就是虚方法。基类的虚方法可以在派生类中使用 override进行重写。
多态:通过指向派生类的基类引用,调用虚函数,会根据引用所指向的派生类的实际类型,调用派生类中的同名重写函数,便是多态。
方法、属性、索引器、事件、都可以声明为virtual或override (重写虚方法方法属性必不能是private,static或者非虚方法不能被重写)
构造函数;
作用:派生类对象中,包含基类的信息,在执行派生类的构造函数的时候,会先去隐式或显式的,调用基类构造函数。因为是有了基类才有派生类
调用顺序:引用类的 实例成员初始化>基类>引用类
protected 关键字是一个成员访问修饰符。 受保护成员在其所在的类中可由派生类实例访问
- 抽象类:
抽象类里面是不能有函数体的,只有声明 ,只有在子类中重写才可以使用
1、抽象类的存在只有一个目的,就是继承;
2、抽象类不能实例化,用abstract修饰;
3、抽象类可以包含抽象成员和普通成员,以及他们的任何组合;
4、抽象类的抽象成员在派生类中需要用override关键字实现;
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp2 { abstract class Pet { protected string _Name; public Pet(string name) { _Name = name; } public void a() { Console.WriteLine("size:"); } virtual public void b() { Console.WriteLine("fb:"); } public void c() { Console.WriteLine(_Name); } abstract public void d(); } class Cat:Pet { public Cat(string name) :base( name) { } new public void a() { Console.WriteLine("13:"); } override public void b() { base.b(); } override public void d() { } } class Program { static void Main(string[] args) { //Console.Write("input:"); //string a = Console.ReadLine(); //Console.WriteLine(":" + a); ////得到字节长度 //Console.WriteLine("size:" + sizeof(int)); int[,] bb = new int[0,1]; Cat b = new Cat("66"); b.a(); b.b(); b.c(); Console.ReadKey(); } } }
- 密封类、密封方法:
1、有些类不希望通过其他人继承;
2、不希望被重写;
1、如果是基类方法不希望子类对其重写,就不声明为virtual
2、如果是派生类不希望其子类(即派生类的派生类)对其进行重写,同时是override重写,就可以使用sealed机制(即同时使用override和sealed)
//加sealed 子类不能再继承 sealed override public void d() { }