ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

夜光带你走进C#语言 基础版本(47)

2019-08-04 09:04:24  阅读:235  来源: 互联网

标签:调用 Run C# 47 子类 父类 方法 public 夜光


夜光序言:

 

人,来到这个世界上,总会有许多的不如意,也会有许多的不公平;生活容不容易,关键看你怎么活。每个人,有每个人的需求;每个人,有每个人的梦想,最终都是想让心灵得到满足。少点攀比,少点比较,不为尘俗所迷,不为物欲所困,认认真真做事,踏踏实实做人。

 

 

 

 

 

 

正文:

为什么一个对象可以用父类声明,却用子类实例化

这个实例是子类的,但是因为你声明时是用父类声明的,所以你用正常的办法访问不到子类自己的成员,只能访问到从父类继承来的成员。

在子类中用 override 重写父类中用 virtual 申明的虚方法时,实例化父类调用该方法,执行时调用的是子类中重写的方法;

如果子类中用 new 覆盖父类中用 virtual 申明的虚方法时,实例化父类调用该方法,执行时调用的是父类中的虚方法;

using System;
namespace GeniusTest01
{
    /// <summary>  
    /// 父类  
    /// </summary>  
    public class ParentClass  
    {  
        public virtual void ParVirMethod()  
        {  
            Console.WriteLine("父类的方法...");  
        }  
    }  

    /// <summary>  
    /// 子类1  
    /// </summary>  
    public class ChildClass1 : ParentClass  
    {  
        public override void ParVirMethod()  
        {  
            Console.WriteLine("子类1的方法...");  
        }  
    }  

    /// <summary>  
    /// 子类2  
    /// </summary>  
    public class ChildClass2 : ParentClass  
    {  
        public new void ParVirMethod()  
        {  
            Console.WriteLine("子类2的方法...");  
        }  

        public void Test()  
        {  
            Console.WriteLine("子类2的其他方法...");  
        }  
    }  
    
    
    public class Class79
    {
        public static void Main(string[] args)
        {
             ParentClass par1 = new ChildClass1();  
                    par1.ParVirMethod(); //结果:"子类1的方法",调用子类的方法,实现了多态
            
                    ParentClass par = new ChildClass2();  
                    par.ParVirMethod(); //结果:"父类的方法",调用父类的方法,没有实现多态  
        }
       
    }
}

 

 

 

 

 

 

深究其原因,为何两者不同,是因为原理不同: override是重写,即将基类的方法在派生类里直接抹去重新写,故而调用的方法就是子类方法;而new只是将基类的方法在派生类里隐藏起来,故而调用的仍旧是基类方法。

应用举例

有这样的需要的,比如 People 类有一个 Run 方法,Man 和 Woman 这两个类都是继承自 People 的类,并且都重写(override)了 Run 这个方法(男人女人跑起步来不一样)。

现在有一群人一起跑步,有男人有女人。

我们可以把这些都装进一个People数组(假设为peoples)。

然后:

foreach(People p in peoples) // peoples中对象不同(即有男有女),用于实例化的子类就不同。
{
    p.Run(); // 故而,调用的方法也不同,实现了多态
}

由于多态性,在调用 p.Run() 的时候 p 对象本身如果是男人就会自动调用男人的 Run 方法,是女人就会调用女人的 Run 方法。

依赖倒置原则

依赖倒置原则,DIP,Dependency Inverse Principle DIP的表述是:

1、高层模块不应该依赖于低层模块, 二者都应该依赖于抽象。

2、抽象不应该依赖于细节,细节应该依赖于抽象。

这里说的“依赖”是使用的意思,如果你调用了一个类的一个方法,就是依赖这个类,如果你直接调用这个类的方法,就是依赖细节,细节就是具体的类,但如果你调用的是它父类或者接口的方法,就是依赖抽象, 所以 DIP 说白了就是不要直接使用具体的子类,而是用它的父类的引用去调用子类的方法,这样就是依赖于抽象,不依赖具体。

其实简单的说,DIP 的好处就是解除耦合,用了 DIP 之后,调用者就不知道被调用的代码是什么,因为调用者拿到的是父类的引用,它不知道具体指向哪个子类的实例,更不知道要调用的方法具体是什么,所以,被调用代码被偷偷换成另一个子类之后,调用者不需要做任何修改, 这就是解耦了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:调用,Run,C#,47,子类,父类,方法,public,夜光
来源: https://blog.csdn.net/weixin_41987706/article/details/98357839

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有