当前位置: 代码迷 >> 综合 >> C# new override 区别 之 掩耳盗铃
  详细解决方案

C# new override 区别 之 掩耳盗铃

热度:22   发布时间:2024-02-05 20:28:38.0

        好久没有写文章了,今天正好遇到一个C# 的基础问题,发现基础还是不够牢靠,这里特意将 new 与 override 的区别再回顾一遍,加深印象,下面将逐步分析 new 与 overide 的区别。

目录

一、继承之子承父业

二、继承之另立门户

三、new之掩耳盗铃

四、override之浪子回头



一、继承之子承父业

        小王由于不务正业,在城里一直找不到工作,其父老王在老家种了一片苹果,打造了【老干爹苹果】品牌,业绩不错。小王决定回去跟老爹一起卖苹果。

代码:

public class Parent
{public void ProduceApple(){Console.WriteLine("老干爹苹果");Console.ReadKey();}
}public class Child : Parent
{}class Program
{static void Main(string[] args){Child child = new Child();child.ProduceApple();}
}

  输出

老干爹苹果

        这是我们期望得到的结果,子类并没有 ProduceApple() 方法,但是其父类有,并且是公开的Public 类型,所以子类可以使用;


二、继承之另立门户

        没过几年,老王和小王的苹果卖的相当不错,挣了不少钱,但是老王怕小王败家,于是把挣来的钱都存了起来。

小王自然不乐意,于是打算自立门户,打造自己的品牌【干儿子苹果】

代码:

public class Parent
{public void ProduceApple(){Console.WriteLine("老干爹苹果");Console.ReadKey();}
}public class Child : Parent
{public new void ProduceApple(){Console.WriteLine("干儿子苹果");Console.ReadKey();}
}class Program
{static void Main(string[] args){Child child = new Child();child.ProduceApple();}
}

 

输出:

干儿子苹果

        子类中 拥有和父类一模一样的方法,并 声明了 new  关键字,对于 子类的对象来说 ,他将调用自己的方法。


三、new之掩耳盗铃

        小王凭借老王之前打下来的名声,也挣了一笔钱,但是老王由于敢于创新,发展了自己的水果厂,业务扩大了。

        小王自然眼红,死皮赖脸求老王,让自己也可以参与水果厂的生意。老王一心软就同意了

        谁知小王竟然企图用 自己 的 【干儿子苹果】,替代 老王的核心业务  【老干爹苹果】,于是他伪造了商标 【假冒的老干爹苹果】

代码:

public class Parent
{public void FruitFactory(){Console.WriteLine("老干爹水果工厂");//核心业务ProduceApple();//其他业务Console.ReadKey();}public void ProduceApple(){Console.WriteLine("老干爹苹果");Console.ReadKey();}
}public class Child : Parent
{public new void ProduceApple(){Console.WriteLine("【假冒的老干爹苹果】");Console.ReadKey();}
}class Program
{static void Main(string[] args){Child child = new Child();child.FruitFactory();}
}

输出:

老干爹水果工厂
老干爹苹果

        小王没有得逞,虽然他参与了老王的水果厂生意,企图替换掉老王的核心业务,【老干爹苹果】,但他失败了。

老干爹苹果厂生产的仍然是老干爹苹果。

老王生气了:臭小子,你以为换了自己的商标,就能替换我的业务了吗?你真是掩耳盗铃啊!

        new 关键字 就像是一块遮住眼睛的布,它 隐藏 了自己不想看见的方法【老王的核心业务ProduceApple()】

但是小王并没有自己的苹果厂,所有的 生产都是在 老王的工厂里发生的 【FruitFactory()】

child.FruitFactory(); 这一句实际是在父类的对象中执行的,对于父类来说,ProduceApple()并没有被隐藏

我们查看一下IL代码:

.method private hidebysig static void  Main(string[] args) cil managed
{.entrypoint// 代码大小       15 (0xf).maxstack  1.locals init ([0] class ConsoleApp1.Child child)IL_0000:  nopIL_0001:  newobj     instance void ConsoleApp1.Child::.ctor()IL_0006:  stloc.0IL_0007:  ldloc.0IL_0008:  callvirt   instance void ConsoleApp1.Parent::FruitFactory()IL_000d:  nopIL_000e:  ret
} // end of method Program::Main

从代码中可以清晰的看出是 FruitFactory() 是在 父类 ConsoleApp1.Parent 中 执行的


四、override之浪子回头

小王被老王当头棒喝,幡然醒悟,于是决定浪子回头,真正的打造自己的产品,这里他使用的工具【override】

并且得到了 老王的支持【virtual】

代码:

public class Parent
{public void FruitFactory(){Console.WriteLine("老干爹水果工厂");ProduceApple();Console.ReadKey();}public virtual void ProduceApple(){Console.WriteLine("老干爹苹果");Console.ReadKey();}
}public class Child : Parent
{public override void ProduceApple(){Console.WriteLine("真干儿子苹果");Console.ReadKey();}
}class Program
{static void Main(string[] args){Child child = new Child();child.FruitFactory();}
}

输出:

老干爹水果工厂
真干儿子苹果

由于小王痛改前非,种植出高质量的苹果,父子合作,终于老王水果厂 的核心业务 替换为了 【真干儿子苹果】

 

 

  相关解决方案