在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.首先来看一看抽象类 抽象类是特殊的类,不能够被实例化:具有类的其他特性:抽象方法只能声明于抽象类中,且不包含任何实现 (就是不能有方法体),派生类也就是子类必须对其进行重写.另外,抽象类可以派生自 ...
随机推荐
- jquery easyui使用(三)······datagrid加载数据(已解决)
<div id="table_Data"> </div> $("#table_Data").datagrid({ toolbar: '# ...
- Android Studio :enable vt-x in your bios security,已经打开还是报错的解决方法
quote: For Windows 10: First of all, install the intelhaxm-android.exe located in the folder SDK\ext ...
- No.005:Longest Palindromic Substring
问题: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...
- 关于tomcat文件下载配置
前言 tomcat文件下载 关闭tomcat目录列表浏览功能 Tomcat 不能下载带中文文件名的附件的方法 在Java Web项目中文件下载是一个很常见的功能,最近在做项目中发现可以通过tomcat ...
- ABP之Javascript生成
还是服务 在调试SimpleTaskSystem的AngularJs demo时,一开始我只看到对服务的应用. app.controller(controllerId, [ '$scope', 'ab ...
- MongoDB基础入门001--安装
关于mongodb的好处,优点之类的这里就不说了,唯一要讲的一点就是mongodb中有三元素:数据库,集合,文档,其中"集合" 就是对应关系数据库中的"表",& ...
- 有问题得就分享(此实现不是 Windows 平台 FIPS 验证的加密算法的一部分)
今天呢,我写完了MD5加密算法的代码,可是我正高兴的想运行时,按了F5.突然了个这样的窗体 我当时就纳闷了,怎么回事? 代码又没有错,这是乍回事! 于是呢上网查了看看:可以这样解决的 在window中 ...
- Semaphore(计数信号量)
//对象池public class Pool<T> { private int size; private List<T> items = new ArrayList<T ...
- MAC 如何使用Github Desktop 客户端
作为开源代码库以及版本控制系统,Github拥有140多万开发者用户.随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首选方法.GitHub上已自动配置的Mac ...
- Android开发6:Service的使用(简单音乐播放器的实现)
前言 啦啦啦~各位好久不见啦~博主最近比较忙,而且最近一次实验也是刚刚结束~ 好了不废话了,直接进入我们这次的内容~ 在这篇博文里我们将学习Service(服务)的相关知识,学会使用 Service ...