C#抽象方法
在覆盖父类的方法时,必须显式说明是在覆盖父类方法,否则相当于没有覆盖。
class Animal {
public void run() {
Console.WriteLine("animal is running");
}
}
class Dog : Animal {
public void run() {
Console.WriteLine("dog is running");
}
}
class haha {
static void Main() {
Animal dog = new Dog();
dog.run();//animal is running
Dog d = new Dog();
d.run();//dog is running
}
}
上面Dog类中的run函数有警告在编译时会有警告:警告:“Dog.run()隐藏了继承的成员Animal.run()。如果是有意隐藏,请使用关键字 new。即便改成下面这样,结果依然没变。
class Dog : Animal {
public new void run() {
Console.WriteLine("dog is running");
}
}
下面重点来了,直接说结论。
在 C# 中,方法不允许隐式覆盖。
派生类若想覆盖基类方法必须显示声明为override
要想把函数声明为override,必须保证基类的同名方法为abstract或者virtual或者override,否则没法把函数声明为override。
这种设计思想的好处是显而易见的,它督促程序员更明确地表达自己的观点,不允许一些implicit的东西。
然而,“要显式不要隐式”跟“约定大于配置”这两个原则是否冲突呢?
抽象类不一定包含抽象方法,包含抽象方法的类必须是抽象类,也就是说,如果方法用abstract修饰,类必须用abstract修饰。
sealed和new是一对
下面看一个标准样例,这段代码是正确而标准的。
class Animal {
public virtual void run() {//将来准备override的函数,必须用virtual声明
Console.WriteLine("animal is running");
}
}
class Cat : Animal {
public sealed override void run() {//如果是覆盖基类函数,必须用override;如果不想再被覆盖,必须用sealed
Console.WriteLine("Cat is running");
}
}
class Tiger : Cat {
public new void run() {//sealed的基类函数必须用new声明,并且不允许用override声明。如果不用new声明,编译报错“不够显式,有点含蓄,C#是反对含蓄的”
Console.WriteLine("tiger is running");
}
}
class haha {
static void Main() {
Animal a = new Tiger();
a.run();//cat is running
Cat b = new Tiger();
b.run();//cat is running
Tiger c = new Tiger();
c.run();//tiger is running
}
}
只有标记为override的函数才允许标记为sealed,否则报错因为“Animal.run()”不是重写,所以无法将其密封
被标记为sealed的函数不允许再次覆盖,派生类中也就是不允许再使用override标记函数
虽然派生类中不允许override基类中的sealed了的函数,但是派生类中可以出现sealed了的同名函数,只是不允许加override,也就是说不允许再进行显示覆盖(C#中的覆盖肯定是显示覆盖,C#不存在隐式覆盖这种东西)。这时,如果不适用new关键字,会报一个警告,就是上面出现过的那个警告:
在编译时会有警告:警告:“Tiger.run()隐藏了继承的成员Cat.run()。如果是有意隐藏,请使用关键字 new。
C#抽象方法的更多相关文章
- java基础1.-------抽象类,抽象方法
抽象类:抽象类不能实例化,类中的方法必须经过子类的重写实现 类里的方法是public修饰时,子类可重写也可不重写 类的方法是abstract修饰时,方法是抽象方法,子类必须重写该方法 类的方法用fin ...
- python 抽象类、抽象方法、接口、依赖注入、SOLIP
1.程序设计原则:SOLIP SOLIP设计原则 1.单一责任原则(SRP) 一个对象对只应该为一个元素负责 2.开放封闭原则(OCP) 对扩展开放,修改封闭 3.里氏替换原则(LSP) 可以使用任何 ...
- 纳尼,java可以在接口中实现非抽象方法了?
纳尼,接口中可以定义实例方法了?! 纳尼,接口中还可以定义静态方法了?! 没错,在Java8中新增了很多新的特性,其中就包括可以在接口中添加方法和变量. 首先我们来看下代码 public interf ...
- C#抽象方法和虚拟方法理解
http://www.cnblogs.com/denylau/archive/2010/04/11/1709573.html http://www.cnblogs.com/naariah/archiv ...
- .net学习笔记--使用抽象方法实现多态
在使用抽象方法实现多态之前,我们必须知道一些知识点: 1.抽象类不能被实例化: 2.抽象类可以包含非抽象成员,它们可以由其子类继承调用. 我们可以先创建一个Person的抽象类,代码如下: abstr ...
- C#类和接口、虚方法和抽象方法及值类型和引用类型的区别
1.C#类和接口的区别接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,类里面有抽 ...
- C#学习系列-抽象方法与虚拟方法的区别
参考:http://www.microsoftvirtualacademy.com/Content/ViewContent.aspx?et=9851&m=9838&ct=31054 如 ...
- JAVA抽象方法,接口
抽象方法(例如:画方法) 抽象方法必须用abstract void修饰 抽象方法没有方法体(方法体就是方法的实现) 抽象方法和空方法体的方法不是同意概念. a) public abstract vo ...
- C#中的抽象方法和虚方法有什么区别?
抽象方法是只有定义.没有实际方法体的函数,它只能在抽象函数中出现,并且在子类中必须重写:虚方法则有自己的函数体,已经提供了函数实现,但是允许在子类中重写或覆盖.重写的子类虚函数就是被覆盖了.
- 【PHP面向对象(OOP)编程入门教程】19.抽象方法和抽象类(abstract)
在OOP语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法做为外部代码访问其的接口.而抽象方法就是为了方便继承而引入的,我们先来看一下抽象类和抽象方法的定义再说明它的用途. 什么是抽象方 ...
随机推荐
- android:Activity四种启动模式简单介绍
Activity启动模式 能够依据实际的需求为Activity设置相应的启动模式,从而能够避免创建大量反复的Activity等问题 Activity有四种载入模式 1.standard(默认启动模式, ...
- 使用jquery操作iframe
1. 内容里有两个ifame <iframe id="leftiframe"...</iframe> <iframe id="mainiframe ...
- DELPHI中千万别直接使用CreateThread ,建议使用BeginThread(在C++中无大问题,可是到了DELPHI中情况就不一样了)
以前在写个别程序的时候老是喜欢使用纯API编程. 在C++中无大问题,可是到了DELPHI中情况就不一样了. 当你用 DELPHI写的多线程程序莫名其妙的内存错误,特别是字符串(string)操作; ...
- Android循环ViewPager(二)
上午没事写了一篇,下午有事,晚上回来看看感觉写的差点意思,上篇文章大概的关于循环是自己添加了两个空的View,看到网上还有一种就是在自定义的Adapter中getCount中返回最大值,然后destr ...
- 浅议 android下的context
android学习中,最开始学习的一个类是activities,你是否知道他与context之间 的关系,我们经常用startactivities来唤起一个activities他的定义有在哪里了,他是 ...
- Ubuntu下安装zookeeper
1:下载安装文件 zookeeper-3.4.9.tar.gz 2:解压到以下目录 /usr/local/services/zookeeper/zookeeper-3.4.9 3:进入conf目录,复 ...
- windows XP系统搜索无线网络时提示“windows无法配置此无线连接”,如何处理?
转自:http://support1.lenovo.com.cn/lenovo/wsi/htmls/detail_12839009034375918.html 文章编号:C191612 201 ...
- window中findstr命令的用法
http://www.netingcn.com/window-findstr-command.html findstr是window系统自带的命令,用途是查找指定的一个或多个文件文件中包含(或通过参数 ...
- STM32F429I-DISCO 和GPS的亲热接触
第27章 GPS LCD显示教程 本期教程为大家解说GPS Global Positioning System(全球定位系统)的使用,.GPS是由美国国防部研制建立的一种具有全方位.全天候.全时段.高 ...
- oracle 建表时显示ORA-00984: 列在此处不允许
oracle 建表时显示ORA-00984: 列在此处不允许 CreationTime--2018年7月19日16点10分 Author:Marydon 1.情景展示 使用plsql建表时,报错 ...