在开发过程中,我们为了让一个类更有生命力,有时会用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#中该如何阻止虚方法的覆写的更多相关文章

  1. C#使用基类的引用 and 虚方法和覆写方法

    结论:使用基类的引用,访问派生类对象时,得到的是基类的成员. 虚方法和覆写方法

  2. C#虚方法和覆写方法

  3. C#中的抽象方法和虚方法有什么区别?

    抽象方法是只有定义.没有实际方法体的函数,它只能在抽象函数中出现,并且在子类中必须重写:虚方法则有自己的函数体,已经提供了函数实现,但是允许在子类中重写或覆盖.重写的子类虚函数就是被覆盖了.

  4. Java中方法的覆写

    所谓方法的覆写override就是子类定义了与父类中同名的方法,但是在方法覆写时必须考虑权限,即被子类覆写的方法不能拥有比父类方法更加严格的访问权限. 修饰符分别为public.protected.d ...

  5. JavaSE复习日记 : 继承关系和super关键字以及继承关系中方法的覆写

    /* * 类的继承和super关键字 * * 软件开发的三大目的: * 可拓展性; * 可维护性; * 可重用性; * * 这里单说下可重用性这一项: * 为了代码复用,复用方式有: * 函数的调用复 ...

  6. [改善Java代码]覆写equals方法必须覆写hashCode方法

    覆写equals方法必须覆写hashCode方法,这条规则基本上每个Javaer都知道,这也是JDK API上反复说明的,不过为什么要这样做呢?这两个方法之间有什么关系呢?本建议就来解释该问题,我们先 ...

  7. JAVA面对对象(二)——继承、方法的覆写

    1.继承就是基于已存在的类构造一个新类,继承已存在的类就能复用类的方法和属性,并且能够添加新的方法和属性.也就是子类和父类 2.一个父类可以拥有多个子类,一个子类只允许有一个父类 3.用extends ...

  8. 菜鸡的Java笔记 第二十 - java 方法的覆写

    1.方法的覆写    当子类定义了与父类中的完全一样的方法时(方法名称,参数类型以及个数,返回值类型)这样的操作就称为方法的覆写    范例:观察方法的覆写 class A{ public void ...

  9. C#中的抽象方法,虚方法,接口之间的对比

    1.首先来看一看抽象类 抽象类是特殊的类,不能够被实例化:具有类的其他特性:抽象方法只能声明于抽象类中,且不包含任何实现 (就是不能有方法体),派生类也就是子类必须对其进行重写.另外,抽象类可以派生自 ...

随机推荐

  1. SignalR的Javascript客户端API使用方式整理

    SignalR的服务端提供了两种实现方式,分别是PersistentConnection和Hub,这两种方式的侧重点不同: PersistentConnection更接近于底层,编程接口比较简单,传输 ...

  2. Win10 UWP系列:更新UWP时注意的问题——TargetDeviceFamily

    前几天把CurrencyExchanger提交到微软参加Master认证,结果没有通过,反馈了一些错误,看来微软检查还是比较仔细的. 错误主要有: Visual feedback helps user ...

  3. Sql Server 覆盖索引

    覆盖索引通常都是复合索引,即索引字段为多个.创建索引时应该注意索引排列顺序. Sql Server检索应用索引时,字段识别顺序为 从左到右. 例如如下索引的使用上 Create NONCLUSTERE ...

  4. 学C++的经验总结

    下面的是学C++时要注意的. 1.把C++当成一门新的语言学习(和C没啥关系!真的.): 2.看<Thinking In C++>,不要看<C++变成死相>: 3.看<T ...

  5. 装饰模式 - Decorator 和 外观模式 - Facade

    装饰模式 Decorator,不改变接口但动态给对象加入责任,所需功能按顺序串联起来控制,比生成子类灵活. 外观模式 Facade,让接口更简单.为子系统中的一组接口提供一个一致的界面. 参考:

  6. 移动端API架构 统一Proxy还是各自为政?

    今天首先回答上一篇的问题: 为什么APP通过运营商接入网络,连通率会那么差? 1. 域名缓存问题 运营商的localdns会缓存域名的解析结果,不向权威DNS递归查询解析 为什么要这么干呢? 1)运营 ...

  7. discuz X3.1 关于分表 和 分表数据迁移

    // *********** 关于读取分表的数据*********** { // forum_thread 分表代码片段 -- 帖子列表 { // 定位某个板块的帖子落在哪个表(forum_threa ...

  8. 一个过滤特殊字符的JS

    <script language="javascript"> function checkForms() { var iu, iuu, regArray=new Arr ...

  9. 源映射(Source Map)详解

    一.什么是源映射 为了提高性能,很多站点都会先压缩 JavaScript 代码然后上线, 但如果代码运行时出现错误,浏览器只会显示在已压缩的代码中的位置,很难确定真正的源码错误位置. 这时源映射就登场 ...

  10. 文章转载利用border、transparent实现微风

    微风效果预览 微风源码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...