C# 多态
说完了继承,说多态。
所谓多态,即为多样。很显然这个多态/多样不是生物学中的那个名词。不过还是可以往这上面靠靠。
在讲多态之前,让我们思考一下代码:
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