简介
主要记录的是继承的相关注意事项
正文
继承
继承只能继承自唯一一个类,但是可以被多个类继承。
//基类
internal class Animal
{
protected string? name;
protected int age;
public void Eat()
{
}
public void Sleep()
{
}
public override string ToString()
{
return name + ","+ age;
}
}
//继承自基类
internal class Dog:Animal
{
public Dog()
{
name = "gaofei";
age = 18;
}
}
//继承自基类
internal class Cat:Animal
{
public Cat()
{
name = "jiafei";
age = 25;
}
}
static void Main(string[] args)
{
Dog dog = new Dog();
Console.WriteLine(dog.ToString());
Cat cat = new Cat();
Console.WriteLine(cat.ToString());
}
//输出
gaofei,18
jiafei,25
向上向下转型
就是基类转子类,子类转基类,略。
as 运算符
as 运算符在 向下类型转换出错时返回 null (而不是抛出异常)
Animal ani = new Animal();
Dog dog = ani as Dog; //ani is null ,但是不会抛出异常
is 运算符
通常在向下类型转换前使用,判断这个类型是否符合条件,略。
static void Main(string[] args)
{
Animal ani = new Animal();
Dog dog = new Dog();
if (ani is Dog d)
{
d = (Dog)ani;
Console.WriteLine(d.ToString());
}
}
1. 虚函数和抽象函数 及抽象类
虚函数为标识为 virtual 的函数,方法、属性、索引器和事件都可以声明为 virtual。
虚函数可以有函数实现,可能被子类重写。
抽象函数只能存在抽象类中,用 abstract 标识。
抽象类不能被实例化,抽象函数也不能写方法实现,需要子类去实现,如果子类不实现,那么子类必须是抽象方法,让继承它的类去实现。
父类普通函数,父类普通函数无法被重写,只能使用 new 关键字被隐藏,只有虚函数才允许被重写。
2. 隐藏父类成员
继承类中添加一个和父类中一个的成员时,叫做隐藏父类成员,如果是有意隐藏,需要添加new 关键字,否则会有一个警告的提示。
class Animal{
protected int age;}
class Cat:Animal{
private new int age;}
隐藏和override重写不一样,当子类向上转型的时候:
- 如果是隐藏方法,那么向上转型后输出的是父类方法
- 如果是重写方法,那么向上转型后输出的还是重写的方法
3.密封函数
密封函数就是在 override 重写函数前面添加 sealed 关键字,作用是防止该重写方法被这个重写函数的子类再去重写。
注意 :只有重写函数 才能被密封
public sealed override void Run(){
}
base关键字
base用于访问父类方法和属性,this用于访问自己类的方法和属性
4. 构造器继承
子类无法直接继承父类的构造器,必须自己显示声明自己的构造器。
或者间接的调用父类构造方法。
public class BaseClass{
public int X;
public BaseClass(){
}
public BaseClass(int x){
this.X =x;}
}
public class SubClass : BaseClass{
public SubClass(int x):base(x){
}
}
重载与重写
重载是相同名字的方法,参数的个数或者参数类型不同,则为重载方法。
重写是子类继承父类时,可以去重写父类的虚函数。
抽象函数那个不叫重写,叫做实现,因为抽象函数并没有实现,需要子类去实现,所以叫实现而不是重写。