C# 多态(2)
2021-04-02 18:27
标签:ati base 消失 virtual lin key 方法 any 属性 接上面讲 我们知道虚方法,和重写方法。 但是有没有发现 override和new的作用是差不多的。 但为什么还要单独写出来两个呢? 首先,咱们要明白一个问题,继承是具有线性传播的。 代码中,Son具有Father的方法,属性。换句话 Son使用的Father的方法。在Son的这个继承链上,使用new来隐藏Father的成员/方法。 但也仅仅是隐藏。 并不代表不存在。 来看实例代码: 结果 话句话说,new关键字仅仅是在子类中的方法隐藏,就是单纯的 我不想在子类中使用使用父类的方法。 但是不代表父类的方法就消失了。 子类依旧是有办法能够使用父类的方法 最简单的证明就是在使用new关键字,在方法内使用base来实现父类的方法。 依旧是管用。 代码: 那么 override呢? 现阶段能够使用的override就只能配合virtual关键字。 那么override是怎么回事呢? 相对new,override是彻底的覆写。包父类的方法。 看代码: 结果: 看见没,连父类的方法都给你整没了。只要你不是单纯的使用父类,如果是通过子类来实现父类的方法而且还是override那基本就是不可能的事情了。 override就是在继承链上彻底抹杀virtual的方法的存在。 如果virtual和new进行搭配呢?直接参考第一种方式。 C# 多态(2) 标签:ati base 消失 virtual lin key 方法 any 属性 原文地址:https://www.cnblogs.com/T-ARF/p/9212622.html 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 Son().Comany();//实例化 Son 并使用方法
Father father = new Son();//父类通过子类实例化
father.Comany();//父类实现方法
Son son = new Son();//实例化子类
(son as Father).Comany();//强转父类,并实现方法
....省略
class Son : Father
{
public Son() => Console.WriteLine($"我继承了我爸的{Money}和公司");
public new void Comany() => base.Comany();
}
static void Main(string[] args)
{
new Son().Comany();//实例化 Son 并使用方法
Father father = new Son();//父类通过子类实例化
father.Comany();//父类实现方法
Son son = new Son();//实例化子类
(son as Father).Comany();//强转父类,并实现方法
} class Program
{
static void Main(string[] args)
{
new Son().Comany();//实例化 Son 并使用方法
Father father = new Son();//父类通过子类实例化
father.Comany();//父类实现方法
Son son = new Son();//实例化子类
(son as Father).Comany();//强转父类,并实现方法
ReadKey();
}
}
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("我不喜欢这个公司");
}
下一篇:18不规则窗体