在C#中该如何阻止虚方法的覆写
在开发过程中,我们为了让一个类更有生命力,有时会用virtual来修饰一个方法好让子类来覆写它。但是如果有更新的子子类来覆写时,我们又不想让其影响到上一层的覆写,这时候就要用到new virtual来阻断覆写了。
关于用法和示例结果,请看下面的代码
public class Animal
{
public virtual void WhoAmI()
{
Console.WriteLine("I am Animal.");
}
} public class Dog : Animal
{
public override void WhoAmI()
{
Console.WriteLine("I am Dog.");
}
} public class Dog1 : Animal
{
public new void WhoAmI()
{
Console.WriteLine("I am Dog1.");
}
} public class HomeDog : Dog
{
/// <summary>
/// 采用new virtual来修饰来阻断覆写
/// </summary>
public new virtual void WhoAmI()
{
Console.WriteLine("I am HomeDog.");
}
} public class HuskyDog : HomeDog
{
public override void WhoAmI()
{
Console.WriteLine("I am HuskyDog.");
}
} [TestFixture]
public class RunTest
{
[Test]
public void NewAndOverrideRun()
{
Dog1 x = new Dog1();
x.WhoAmI(); //I am Dog1. ((Animal)x).WhoAmI();//I am Animal. //new修饰的方法调用,取决于类型。
} [Test]
public void OverrideRun()
{
Dog x = new Dog();
x.WhoAmI();//I am Dog. var x1 = x as Animal;
x1.WhoAmI();//I am Dog. //override修饰符的方法调用,取决于实例化对象的类型
} [Test]
public void NewVirtualRun()
{
var x = new HomeDog();
x.WhoAmI();//I am HomeDog. ((Dog)x).WhoAmI();//I am Dog. ((Animal)x).WhoAmI();//I am Dog. //new virtual阻断了方法的向上覆写。并且,Dog的覆写不受影响
} [Test]
public void NewVirtualThenOverrideRun()
{
var x = new HuskyDog();
x.WhoAmI();//I am HuskyDog. ((HomeDog)x).WhoAmI();//I am HuskyDog. ((Dog)x).WhoAmI();//I am Dog. ((Animal)x).WhoAmI();//I am Dog. //new virtual 阻断向上的覆写,但是新的子类覆写它时不和原来覆写结果一样。
} }
关于覆写阻断的代码演示
在C#中该如何阻止虚方法的覆写的更多相关文章
- C#使用基类的引用 and 虚方法和覆写方法
结论:使用基类的引用,访问派生类对象时,得到的是基类的成员. 虚方法和覆写方法
- C#虚方法和覆写方法
- C#中的抽象方法和虚方法有什么区别?
抽象方法是只有定义.没有实际方法体的函数,它只能在抽象函数中出现,并且在子类中必须重写:虚方法则有自己的函数体,已经提供了函数实现,但是允许在子类中重写或覆盖.重写的子类虚函数就是被覆盖了.
- Java中方法的覆写
所谓方法的覆写override就是子类定义了与父类中同名的方法,但是在方法覆写时必须考虑权限,即被子类覆写的方法不能拥有比父类方法更加严格的访问权限. 修饰符分别为public.protected.d ...
- JavaSE复习日记 : 继承关系和super关键字以及继承关系中方法的覆写
/* * 类的继承和super关键字 * * 软件开发的三大目的: * 可拓展性; * 可维护性; * 可重用性; * * 这里单说下可重用性这一项: * 为了代码复用,复用方式有: * 函数的调用复 ...
- [改善Java代码]覆写equals方法必须覆写hashCode方法
覆写equals方法必须覆写hashCode方法,这条规则基本上每个Javaer都知道,这也是JDK API上反复说明的,不过为什么要这样做呢?这两个方法之间有什么关系呢?本建议就来解释该问题,我们先 ...
- JAVA面对对象(二)——继承、方法的覆写
1.继承就是基于已存在的类构造一个新类,继承已存在的类就能复用类的方法和属性,并且能够添加新的方法和属性.也就是子类和父类 2.一个父类可以拥有多个子类,一个子类只允许有一个父类 3.用extends ...
- 菜鸡的Java笔记 第二十 - java 方法的覆写
1.方法的覆写 当子类定义了与父类中的完全一样的方法时(方法名称,参数类型以及个数,返回值类型)这样的操作就称为方法的覆写 范例:观察方法的覆写 class A{ public void ...
- C#中的抽象方法,虚方法,接口之间的对比
1.首先来看一看抽象类 抽象类是特殊的类,不能够被实例化:具有类的其他特性:抽象方法只能声明于抽象类中,且不包含任何实现 (就是不能有方法体),派生类也就是子类必须对其进行重写.另外,抽象类可以派生自 ...
随机推荐
- MongoDB - basic
mongoDB basic from:http://www.tutorialspoint.com/mongodb prject:https://github.com/chenxing12/l4mong ...
- 3.Code-First 约定(EF Code-First系列)
前面,我们已经了解了Code-First利用领域类,怎么为我们创建数据库的简单示例.现在我们来学习一下Code-First约定吧. 什么是约定 约定说白了,就是基于一套规矩办事,这里就是基于你定义好的 ...
- 用户反馈:对 Rafy 开发框架的一些个人建议
这篇文章是去年 Rafy 框架发布后,许胜平先生为我提出的一些建议.他从用户群体分析.社区.商业模式.技术支持等方面对框架发展提出了建议,我觉得写得非常不错.此文不仅适用于 Rafy 框架,所以不 ...
- 使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和解密
在数据库实现加密与解密的文章,Insus.NET较早前也有写过,可以在本博客中可以搜索得到. 今天使用EncryptByPassPhrase和DecryptByPassPhrase来简单实现. 在数据 ...
- Genesis2000使用c#开发脚本
这是我自学程序以来在博客园的第一篇博客,如有不好的地方请大家指正,谢谢! 这边文章的目的是给予那些在PCB使用Genesis2000程序脚本开发的人员提供.net平台下的开发方法. 目前genesis ...
- compilation与编译
关于本配置节的内容不算多,但关于ASP.NET编译的内容还是有一点的,鄙人认为只是了解一下即可,主要影响到部署. 在 App_Code 文件夹中使用多种编程语言 因为 App_Code 文件夹中的源代 ...
- C# Enum,Int,String的互相转换 枚举转换
Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基 ...
- 利用SHELL脚本实现文件完整性检测程序(1.2版更新)
一..开发背景 因时势所逼,需要对服务器的文件系统实行监控.虽然linux下有不少入侵检测和防窜改系统,但都比较麻烦,用起来也不是很称手.自己琢磨着也不需要什么多复杂的功能,写个脚本应该就可以满足基本 ...
- js 20160810
jquery 获取不到所有相同id 的元素 ,只能获取此id的第一个元素.可以获取所有相同class 的元素
- SuperMap iServer Ubuntu 开机自启动脚本
在/etc/init.d/文件夹里面设置相关的文件 1.为了保证创建文件的读写权限与默认一致,我们只需要cp一个默认的启动文件即可 2.删除iserver里面的所有信息 提示:直接执行“:1,$d” ...