zoukankan      html  css  js  c++  java
  • 继承小结

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

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

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

  • 相关阅读:
    linux 网络相关
    工作随笔
    python
    trouble-shooting
    MySQL常见问题总结
    根据 Request 获取客户端 IP
    文件上传按钮优化
    Linux中RabbitMQ安装
    linux 完全卸载MySQL
    Linux 下安装 MySQL-5.7.24
  • 原文地址:https://www.cnblogs.com/TheLin/p/14483060.html
Copyright © 2011-2022 走看看