zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    亚马逊云IoT平台接入开发记录
    pip下载速度慢更换清华源试试
    gitlab回归上一次提交
    uos桌面壁纸存放路径
    python中json中的dump和dumps
    Python中的类中__dict__方法
    C++ | 数组反转的三种方法
    《C++Primer Plus》 | 复合类型
    pwn 中的函数 | 持续更新
    七月安恒DASCTF | 复现
  • 原文地址:https://www.cnblogs.com/T-ARF/p/9211209.html
Copyright © 2011-2022 走看看