• 继承小结


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

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

    类。 但是,继承是可传递的。 如果 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、修饰符

  • 相关阅读:
    转载c++中的多态性
    sdk环境下数据库访问之ADO
    ADO数据库访问问题
    PopMenu 弹出式菜单(变灰,禁用,激活)
    控制台窗口界面控制设计
    判断整数序列是不是二元查找树的后序遍历结果
    把二元查找树转变成排序的双向链表
    二叉树平衡因子应用举例
    二元查找树转换为它的镜像
    满二叉树先序、中序和后序之间的转换
  • 原文地址:https://www.cnblogs.com/TheLin/p/14483060.html
Copyright © 2020-2023  润新知