面向对象的三大特征之继承
一,概念
1,继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法。
2,继承就是在类之间建立一种关系,使得子类的实例可以继承父类已有的属性和方法,
3,并且继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
二,子类和父类
1,通过继承创建的新类称为“子类”或“派生类”,
2,被继承的类称为“基类”、“父类”或“超类”。
三,继承的过程,就是从一般到特殊的过程。
四,继承概念的实现方式有二类:实现继承与接口继承。
1,实现继承是指直接使用基类的属性和方法而无需额外编码的能力;
2,接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
五,继承的意义;
主要实现重用代码,节省开发时间, 使得程序的创建和维护变得容易。
六,继承在生活上我们可以这样理解
家族继承财产,爷爷将自己财产继承给儿女,儿女在将爷爷的财产和自己挣得财产继承给子孙,有些东西可以继承有些的东西只继承给某人。
七,继承的语法
一个类可以派生多个类或者接口,这就意味着它可以从多个父类或者接口继承数据和函数.
<访问修饰符符> class <父类>
{
...
}
class <子类> : <父类>
{
...
}
八,C#继承规则
1,继承是能够传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同时也继承了A中的成员。注意:Object类是所有类的基类。
2,派生类应该是对基类的扩展。派生类可以添加新的成员,但是不能移除已经继承的成员的定义。
3,构造函数和析构函数不能被继承。除此之外的其它成员,都能被继承。基类中成员的访问方式只能决定派生类是否能访问它们。
4,派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。此时,派生类不能访问被覆盖的成员,不过,使用new修饰符可以声明具有相同名称或签名的新成员。
5,类可以使用virtual修饰符定义虚方法、虚属性和虚索引指示器,它的派生类能够使用override修饰符来重载这些成员。
6,派生类只能从一个类中继承,可以通过接口实现多重继承。
九,继承例举;
第一个继承(狗类);
//父类
class Dog//class 基类(父类)
{
public void eat()//在父类中封装一个方法
{
Console.WriteLine("吃东西没剩");
}
public Dog(string dog)//构造函数
{
Console.WriteLine("狗的品种!");
}
}
//派生类(子类)
class Hsq:Dog//class 继承类(子类):基类(父类)
{
public void wan()
{
Console.WriteLine("玩啥没够!");
}
public Hsq(string gn) : base(gn)
{
Console.WriteLine("哈士奇吵架没输过,打架没赢过!");
}
}
//派生类(子类)
class Zy :Hsq
{
public Zy(string zuoyong) : base(zuoyong)
{
Console.WriteLine("家里乱不乱,二哈说了算!");
}
}
第二个继承(猫类);
class Cat
{
public void eat()
{
Console.WriteLine("爱吃麻辣小鱼干");
}
public Cat(string mao)
{
Console.WriteLine("猫的品种!");
}
}
class Mao:Cat
{
public void wan()
{
Console.WriteLine("爱玩个球");
}
public Mao(string abc) : base(abc)
{
Console.WriteLine("撒娇没输过,凶人没赢过!");
}
}
class Mzy:Mao
{
public Mzy(string zy):base(zy)
{
Console.WriteLine("拿耗子,关灯,还粘人!");
}
}
最后外部调用;
static void Main(string[] args)
{
Zy hsq = new Zy("哈士奇");//实例化最后的子类
hsq.eat();//表示在最后子类中可以调用父类中的方法
hsq.wan();
Console.WriteLine(" ");//方便区分
Mzy xiaomao = new Mzy("小猫");
xiaomao.eat();
xiaomao.wan();
Console.ReadLine();
}
显示出来的结果;
十,继承时需要注意的地方
1,当子类继承父类以后,子类就可以访问父类中的成员变量和成员方法,但是不可以直接继承父类的构造函数,如果构造函数的父类有形参,那么子类必须手写构造函数,而且参数的个数和类型必须一致,子类必须使用:base()方法,继承父类有参数的构造函数
2,如果父类中成员变量是私有的,子类是访问不到父类中的这个私有的成员变量
3,子类继承父类之后,实例化子类,就相当于调用了父类的构造函数,前提是子类继承了父类有参数的构造函数
4,子类继承父类,没有参数的构造函数,也会被继承