继承:发生在基类和派生类中,也就是父类和子类。 子类继承父类,通过继承可以访问到父类的成员方法,也可以通过重写访问到父类的抽象或者虚方法。。。
但是需要注意的一点是在执行过程中,先执行基类中的方法或者是构造函数,再执行子类中的成员方法。如果子类中定义的成员方法和父类中的成员方法一样,并且需要覆盖掉父类的成员方法则需要通过关键字 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方法"); } }