继承小结

面向对象三大特性:封装、继承、多态。

继承用于创建可重用、扩展和修改在其他类中定义的行为的新类。 其成员被继承的类称为“基类”,继承这些成员的类称为“派生类”。 派生类只能有一个直接基

类。 但是,继承是可传递的。 如果 ClassB 派生出 ClassC,ClassA 派生出 ClassB,则 ClassC 会继承 ClassB 和 ClassA 中声明的成员。

1、继承的语法

可用下面语法声明类的继承。

public class Chinese:Person
    {

    }

所有类都直接或间接继承于object类

2、虚方法

有时候我们继承一个基类的某些方法希望能重新定义这个方法,我们可以把一个基类函数声明virtual,就可以在任何派生类中重写这个函数:

public class Person
    {
        public string Name { get; set; }

        public virtual void Print(Person person)
        {
            Console.WriteLine("名字是" + person.Name);
        }
    }
    public class Chinese : Person
    {
        public override void Print(Person person)
        {
            Console.WriteLine("我是中国人,我的名字是" + person.Name);
        }
    }

可在派生类中重写该方法的方法体,但必须显示声明override。

成员字段和静态函数都不能声明为virtual,因为这个概念只对类中的实例函数成员有意义。

3、隐藏方法

如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有分别声明为virtual和 override,派生类方法就会隐藏基类方法。

在C#中,要隐藏一个方法应使用new关键字声明。

在父类类型变量里装子类类型对象,调用父类的虚方法会跳转到子类的重写方法。

new修饰符起到一个截断继承链的作用。

如果只有两个类,子类隐藏了父类方法则会调用父类方法。

 class Program
    {
        static void Main(string[] args)
        {
            AnQing anQing = new AnQing();
            AnHui anHui = anQing;
            Chinese chinese = anQing;
            Person person = anQing;
            anQing.Print();
            anHui.Print();
            chinese.Print();
            person.Print();
            Console.ReadKey();
        }
    }
    public class Person
    {
        public string Name { get; set; }

        public void Print()
        {
            Console.WriteLine("我是人");
        }
    }
    public class Chinese : Person
    {
        public virtual void Print()
        {
            Console.WriteLine("我是中国人" );
        }
    }
    public class AnHui : Chinese
    {
        public override void Print()
        {
            Console.WriteLine("我是安徽人");
        }
    }
    public class AnQing : AnHui
    {
        public new void Print()
        {
            Console.WriteLine("我是安庆人");
        }
    }

4、调用函数的基类版本

使用base关键字即可在派生类中调用函数的基类版本

5、抽象类和抽象函数

C#允许把类和函数声明为abstract。抽象类不能实例化,而抽象函数不能直接实现,必须在非抽象的派生类中重写。

如果类包含抽象函数,则该类也是抽象的,也必须声明为抽象的。

 public abstract class Person
    {
        public abstract void Print();
       
    }
    public class Chinese : Person
    {
        public override void Print()
        {
            Console.WriteLine("你好");
        }
    }

6、修饰符

原文地址:https://www.cnblogs.com/TheLin/p/14483060.html