好久没有写文章了,今天正好遇到一个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();}
}
输出:
老干爹水果工厂
真干儿子苹果
由于小王痛改前非,种植出高质量的苹果,父子合作,终于老王水果厂 的核心业务 替换为了 【真干儿子苹果】