zoukankan      html  css  js  c++  java
  • C# 继承的实现方式

    虚方法:

        如果要在派生类中继承方法或属性,那么就必须在基类中将该属性声明为virtual。

        方法或属性在默认情况下是不虚拟的,所以如果不在基类中显示声明,在派生类中用override重写该方法时就会报错。

        当然,如果在派生类中用new来隐藏基类方法也没有问题。

        我们看下面一个例子:

     public class A
        {
            public void MethodF() 
            { 
                Console.WriteLine("A.F"); 
            }
            public virtual void MethodG() 
            { 
                Console.WriteLine("A.G"); 
            }
        }
        public class B : A
        {
            new public void MethodF() 
            { 
                Console.WriteLine("B.F"); 
            }
            public override void MethodG() 
            { 
                Console.WriteLine("B.G"); 
            }
        }
        class Test
        {
            static void Main()
            {
                B b;
                b = new B();
                A a = b;
                a.MethodF();
                b.MethodF();
                a.MethodG();
                b.MethodG();
            }

    它的结果是: 

    A.F B.F B.G B.G

    也许你会很奇怪为什么a.methodG()的结果为什么是B.G。

    那是因为A的methodG方法是虚方法,如果有派生类继承了这个方法,那么它就会首先去找这个派生类的继承方法并实现它。

    隐藏方法

        通常是在不重写基类方法,但又需要再派生类中创建一个相同方法时使用。

        只要在派生类方法的前面加一个new就能实现对基类方法的隐藏。

    如:

    class BaseClass
     {
            public int Add(int a, int b) {
                return a + b + 1;
            }
    }
    
    class Test1 : BaseClass
    {
            new public int Add(int a,int b) 
            {
                return a + b;
            }
    }

    如果new一个基类,则调用Add方法时调的是基类的Add方法。

    反之则调用Add方法时调的是派生类的Add方法。

    密封类和密封方法:

        这个简单,只要在类或方法前声明一个sealed属性,就可以让该类或方法无法被继承。

        在C#中,string类就是一个sealed类。但是让我们认真分析一下string类,可以发现它还是有3个方法是可以继承的。

        GetHashCode(),ToString(),Equals()

        然后对比这三个方法与其他方法的不同,可以发现只有这三个方法是被声明了override属性。

        也就是说,在sealed类中,只要将方法声明为override,该方法就可以被继承。

    派生类的构造函数

        我看的是C#高级编程第七版中的“派生类的构造函数”一节,老实说毕竟是翻译的书籍,理解起来有点深涩,于是上网找了一个略解,意思就清楚了。

        http://blog.csdn.net/liuzhenpolestar/article/details/5828187

       大概的意思是如有基类没有默认的无参构造函数,只有有参构造函数,派生类就必须要往基类传参。具体可以看上面链接里的内容。

       然后书中的例子也有些不当。

    例子是:

    class BaseClass
    {
            private string name;
    
            public BaseClass(string name){
                this.name = name;
            }
    }
    
    class Test1 : BaseClass
    {
            public Test1(string name):base(name)
            {
               
            }
    }

    像name这样的通用属性,一般不会用private属性进行修饰,而是用protected进行修饰。本来意思就是晦涩了,搞个不伦不类的例子,误导人啊这是!

    改造后可以写成这样:

        class BaseClass
        {
            protected string name;
    
            public BaseClass(){}
        }
    
        class Test1 : BaseClass
        {
            public Test1(string name)
            {
                this.name = name;
            }
        }
  • 相关阅读:
    mysql优化
    c语言学习的第10天
    学习c语言的第9天
    学习c的第8天
    学习c的第7天
    学习c的第6天2
    c语言学习的第6天
    sed命令实战
    grep命令实战
    c语言学习的第五天
  • 原文地址:https://www.cnblogs.com/nonkicat/p/2783073.html
Copyright © 2011-2022 走看看