首页 > Windows开发 > 详细

C# 多态

时间:2018-06-21 23:30:08      阅读:250      评论:0      收藏:0      [点我收藏+]

说完了继承,说多态。

所谓多态,即为多样。很显然这个多态/多样不是生物学中的那个名词。不过还是可以往这上面靠靠。

在讲多态之前,让我们思考一下代码:

class NameList
    {
        public NameList() => Console.WriteLine("这个是NameList的构造函数");

        public NameList(string Name) => Console.WriteLine($"这个是NameList的重载构造函数,输入的参数是{Name}");

        ~NameList() => Debug.WriteLine("释放NameList");

        public string Name { get; set; }

        public void ID() => Console.WriteLine($"我的id是{Name}");

        public void Show<T>(T type) where T : NameList => Console.WriteLine(type.GetType().FullName);
    }


    class A : NameList
    {

        public A() : base() => Console.WriteLine("这是A类的初始化,也就是构造函数");

        public A(string Name) : base(Name) =>Console.WriteLine($"这个是A的重载构造函数,输入的参数是{Name}");

        ~A() => Debug.WriteLine("释放A");

        public void ShowType() => base.Show<A>(this);

        public void ID() => Console.WriteLine("这个ID方法是A类");
    }
    class B : NameList
    {

        public B() : base() => Console.WriteLine("这是A类的初始化,也就是构造函数");

        public B(string Name) => Console.WriteLine($"这个是B的重载构造函数,输入的参数是{Name}");

        ~B() => Debug.WriteLine("释放B");

        
        
    }

 emm

 基本结论:

 1 A,B两类都是继承NameList

 2 A,B两类虽然继承NameList但是很少用到父类的方法。甚至还有写需要隐藏父类成员。

 3 父类其实很限制子类

换句话说,其实AB类可能不需要父类的方法,有可能只是需要一个名字,父类的方法的实现子类并不需要,子类有自己的想法,有自己的做法。

ok,我们知道了这些东西,那么我们先其他放一放,先说个故事:

  有一个爸爸和一个儿子, 爸爸有500万,和一个公司。 儿子都继承了下来,儿子很需要500万,但不满意公司的做法,甚至公司整体。 儿子有自己的想法,对公司进行改造。

(1)如果这个这个爸爸是一个没有远见的人,不在乎儿子怎么想,就那么直接将东西继承给儿子,儿子有可能很被动,因为有部分需要,有部分不需要,又不可能扔掉,或者选择视而不见,要么顶着压力改造。

(2)但如果这个爸爸是一个很有远见的人,很在在乎儿子,由爸爸可能会对他的资产进行整理,比如公司,也许儿子不喜欢,爸爸会对公司进行设置,告诉公司以后要听儿子的。但对钱很可能就不管了,因为儿子没有理由不喜欢是不是。

 

1,2很显然是两种结果,我们不妨用代码实现一下。

所以 ,我们要重新编写代码了【原有的代码实在是太杂乱了】

(1)结果一

 class Father
    {
        public int Money => 500; 

        public void Comany() => Console.WriteLine("公司年年都赚钱!!!!");
    }


    class Son : Father 
    {
        public Son() => Console.WriteLine($"我继承了我爸的{Money}");

        public new void Comany() => Console.WriteLine("我不是很喜欢我的我爸爸的公司");
        
    }

 

儿子还是很强硬的,结果一的代码,我们基本全都能以现在的代码

但是第二种呢? 仔细思考一下,公司可以是听爸爸的,也可以听儿子,这取决于儿子是否想要对公司是否改造,或者直接接手。 如果改造爸爸还是高兴,毕竟爸爸同意了

我们现有的知识可以完成吗? 恐怕是不能的,虽然我们可以用new关键字来进行隐藏父类,但是这不符合爸爸高兴,这一要求啊。

那么怎么办呢?

来 先看代码:

class Father
    {
        public int Money => 500; 

        public virtual void Comany() => Console.WriteLine("公司年年都赚钱!!!!");
    }


    class Son : Father 
    {
        public Son() => Console.WriteLine($"我继承了我爸的{Money}");

        public override void Comany() => Console.WriteLine("我不是很喜欢我的我爸爸的公司");
        
    }

有两个新东西:

Virtual 和 override

Virtual :虚拟化

override:重写

父类的方法体前加上virtual,意味着子类可以重写这个方法。

子类的方法前加上override,意味是子类重写父类的方法。

这些东西叫做重写

当你编写父类时,想某些方法可以在子类中重写,可以使用virtual,子类中重写使用override

C# 多态

原文:https://www.cnblogs.com/T-ARF/p/9211209.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!