[C#基础学习]继承

C#中极其有用的功能。

基本概念

某个类可以继承其他类的内容并继续发展。被继承的类一般叫父类,继承者一般叫子类。

一个子类只能有一个父类(C++倒是可以多继承,但是C#就不行),并且可以继承父类的父类。

class a//这是爹
{
    void funcDad(){}
}

class b: a //儿子来咯
{
    //这里可以引用funcDad()
} 

class c: a,b //违法

同名成员

在子类定义了与父类同名的参数或函数,则父类的参数或函数会被子类覆盖。不推荐用。

class a{
	public float num;
}

class b: a{
    public float num;//同名成员
}

继承内的构造函数

​ 和之前的构造函数一致

class a{
	a();
}
class b: a{
	b(){};
}

执行顺序:a() -> b(),会先进行父类构造函数再到子类构造函数。如果父类缺失构造函数(未显式定义),但子类调用了子类构造函数,则立刻报错。必须补全父类的构造函数(即使是空)才能调用子类构造函数。

如果希望调用特定的父类构造函数,则使用base()

class a{
    a(){}
	a(int i){}
}
class b: a{
    b(int i): base(i){}
}

访问修饰符

访问修饰符名字作用 作用
public 全都能访问
private 仅限当前类,但子类不能直接用
protected 仅限当前类,但子类也可以用
internal 仅限当前程序集,也就是单个dll或单个exe内
sealed 禁止任何继承

里氏替换原则

​ 用父类装载子类

class dad{
	void func
}
class child1: dad{
	void childfunc1()
}
class child2: dad{
	void childfunc2()
}
static void main()
{
	dad a = new child1();
	dad b = new child2();
}

但是此时父类容器不能调用子类方法。

a.childfunc1()//不能调用

解决方案: is 和 as

if( a is child1)//是否为这个类
    ;
else if(a is child2)
    ;
child1 temp = a as child1;//转换为指定类,转换失败则返回空
if(temp != null)//是否为空
	....;//execute
posted @ 2023-07-05 23:32  ComputerEngine  阅读(25)  评论(0编辑  收藏  举报