namespace console_父类子类 { class Program { public static void Main(string[] args) { showTest t = new showTest(); // 情况1 默认情况下调用父类的方法 t.show(new Son1()); //"i·m parent..." // 情况2 通过virtual 或 abstract 子类用 override 重写方法参与虚调用 // c# 不能多继承,派生类重写某个虚拟成员时,即使该派生类的实例被当作基类的实例访问,也会调用该成员 // 理解上面这句话很重要,当派生再次被继承时,他也是只调用实现了重写的虚方法,反之则调用最近实现重写的方法 // 如果都没有实现则还是调用 基类的方法 t.show(new Son1()); //"i·m son1..." t.show(new Son2()); //i·m son2... // 情况3 派生类通过new 来阻止 被调用 t.show(new Son1()); //i·m parent... // 情况4 当派生中拥有相同的成员时 Console.WriteLine(((Parent)new Son1()).test1); // 情况5 当父类定义虚方法virtual 派生必须实现方法,new关键字可以阻止被调用 // sealed 可以停止虚拟继承 t.show(new Son2()); //"i·m son2..." // 报错 因为父类中相同的方法已经被sealed 修饰停止了虚拟继承
// sealed 限制的是派生类被重写
t.show(new SonSon()); Console.ReadKey(true); } public static void test(IPerson p){ p.test(); } } //一个测试类 class showTest{ public void show(Parent p){ p.test(); } public void showproperty(Parent p){ Console.WriteLine(p.test1); } } //定义一个父类 class Parent{ //定义基类方法, 派生类重新次方法,默认情况下调用父类 public string test1 {get {return p;}} public string p = "p"; public virtual void test(){ Console.WriteLine("i·m parent..."); } } //子类 class Son1 : Parent { public string test1 {get {return p;}} public string p = "s"; public override void test(){ Console.WriteLine("i·m son1..."); } } //子类 class Son2 : Parent { public override void test(){ Console.WriteLine("i·m son2..."); } } class SonSon : Son2{ public override void test(){ Console.WriteLine("i`m sonson..."); } } interface IPerson{ void test(); } class Son3 : IPerson{ public void test(){ Console.WriteLine("i`m son3"); } } }