[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