详细区分类继承的各种形式

在继承中有new、override、构造函数等等不同的形式,这篇文章就是为了区分在这些情况下调用的到底是哪个类的什么方法,加深对类继承的理解。

长文阅读,大部分是代码。

new、override是对类中的成员使用的,这里以方法示例,其它成员如字段也是一样的。

第一种:在子类中写一个名字相同的方法,既不用new,又不用override

class BaseClass
    {
        public virtual void Print()
        {
            Console.WriteLine("Base.Print");
        }
    }

    class DerivedClass : BaseClass
    {
        public void Print()
        {
            Console.WriteLine("Derived.Print");
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            DerivedClass derivedClass = new DerivedClass();
            BaseClass baseClass = (BaseClass)derivedClass;
            derivedClass.Print();
            baseClass.Print();
            Console.ReadKey();
        }
    }

输出为:

    

Derived.Print
Base.Print

在子类的print会警告,不推荐这种写法。

第二种:在子类中使用new

class BaseClass
    {
        public virtual void Print()
        {
            Console.WriteLine("Base.Print");
        }
    }

    class DerivedClass : BaseClass
    {
        new public void Print()
        {
            Console.WriteLine("Derived.Print");
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            DerivedClass derivedClass = new DerivedClass();
            BaseClass baseClass = (BaseClass)derivedClass;
            directedClass.Print();
            baseClass.Print();
            Console.ReadKey();
        }
    }

输出:

    

Derived.Print
Base.Print

new就是说这个方法是子类自己的,跟父类没有任何继承关系,仅仅是重名,所以之类和父类都是调用自己里面的方法。

第三种:使用override进行覆写

(1)两个类之间的继承

class BaseClass
    {
        public virtual void Print()
        {
            Console.WriteLine("Base.Print");
        }
    }

    class DerivedClass : BaseClass
    {
        override public void Print()
        {
            Console.WriteLine("Derived.Print");
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            DerivedClass derivedClass = new DerivedClass();
            BaseClass baseClass = (BaseClass)derivedClass;
            derivedClass.Print();
            baseClass.Print();
            Console.ReadKey();
        }
    }

输出:

Derived.Print
Derived.Print

使用override会覆写父类的方法,其实是调用最高派生类的方法。

(2)多个类的继承

class BaseClass
    {
        public virtual void Print()
        {
            Console.WriteLine("Base.Print");
        }
    }

    class DerivedClass : BaseClass
    {
        override public void Print()
        {
            Console.WriteLine("Derived.Print");
        }
    }

    class SecondDerived : DerivedClass
    {
        public override void Print()
        {
            Console.WriteLine("SecondDerived.Print");
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            SecondDerived secondDerived = new SecondDerived();
            BaseClass baseClass = (BaseClass)secondDerived;
            secondDerived.Print();
            baseClass.Print();
            Console.ReadKey();
        }
    }

输出:

    

SecondDerived.Print
SecondDerived.Print

从这里就可以看出调用的是最高派生类的方法,当然,前提是使用了override进行覆写

第四种:增加构造函数的覆写

class BaseClass
    {
        public BaseClass()
        {
            Print();
        }
        public virtual void Print()
        {
            Console.WriteLine("Base.Print");
        }
    }

    class DerivedClass : BaseClass
    {
        public DerivedClass()
        {
            Print();
        }
        override public void Print()
        {
            Console.WriteLine("Derived.Print");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            BaseClass baseClass = new DerivedClass();
            baseClass.Print();
            Console.ReadKey();
        }
    }

可以自己思考一下会输出什么


输出:

Derived.Print
Derived.Print
Derived.Print

这是因为先执行了Baseclass中的构造函数,再执行DerivedClass的构造函数,最后执行DerivedClass中的Print方法。

我暂时对继承就理解到这里,有其它的理解可以和我交流哦。

转载请注明出处。吐舌头

猜你喜欢

转载自blog.csdn.net/a_clear_chen/article/details/80114408
今日推荐