继承:发生在基类和派生类中,也就是父类和子类。 子类继承父类,通过继承可以访问到父类的成员方法,也可以通过重写访问到父类的抽象或者虚方法。。。
但是需要注意的一点是在执行过程中,先执行基类中的方法或者是构造函数,再执行子类中的成员方法。如果子类中定义的成员方法和父类中的成员方法一样,并且需要覆盖掉父类的成员方法则需要通过关键字 new 来处理。实现代码如下:
static void Main(string[] args){//很重要的一点:继承时先执行基类构造函数,后执行派生类构造函数,最后再执行方法Man man = new Man();man.Eat();}public class People{public People(){Console.WriteLine(\"父类的构造函数\");}public void Eat(){Console.WriteLine(\"父类吃饭\");}}public class Man : People{public Man(){Console.WriteLine(\"子类构造函数\");}//通过new关键字来隐藏基类中的成员方法public new void Eat(){Console.WriteLine(\"我是子类\");}}
抽象类、abstract抽象方法、virtual虚方法。如果一个类中的成员方法通过abstract关键字定义了抽象方法,则对应的类必须abstract实现抽象类。。。
抽象类不能实例化。抽象方法没有具体执行代码,必须在非抽象的派生类中重写(通过override关键字),这一点和接口有相同的地方
还有一种类需要注意,那就是密封类。如果我们对类不作任何约束,也就是说所有类都可以被继承,这种继承的滥用会导致类的层次结构十分庞大,类与类之间的关系会变得很乱导致无法理解。因此C#提供了密封类,我们只需在父类前加上sealed修饰符,那这个类将不能被继承了。密封方法也是在方法前加上sealed修饰
代码如下:
public abstract class People{public People(){Console.WriteLine(\"父类的构造函数\");}//抽象方法:类中方法定义为抽象方法,对应的类必须也声明为抽象类public abstract void Eat();//有时候不想把类定义为虚方法,但是又想该方法在子类中进行重写,那么则可以通过virtual关键字定义虚方法,子类重写来实现public virtual void Say(){Console.WriteLine(\"我是父类的虚方法\");}}public class Man : People{public Man(){Console.WriteLine(\"子类的构造函数\");}//子类重写父类的抽象方法public override void Eat(){Console.WriteLine(\"我是子类\");}//重写父类的Say()方法public override void Say(){Console.WriteLine(\"我是子类的Say方法\");}}