c#中abstract、override、new、virtual、sealed使用和示例
原文地址:http://blog.csdn.net/richerg85/article/details/7407544
abstract
修饰类名为抽象类,修饰方法为抽象方法。如果一个类为抽象类,则这个类智能是其他某个类的基类。抽象方法在抽象类中没有函数体。抽象类中的抽象方法是没有方法体的,继承其的子类必须实现抽象类的抽象方法。
抽象类有如下特征:
- 抽象类不能实例化
- 抽象类的派生类必须实现所有抽象方法
- 抽象类中的抽象方法是没有方法体的,继承其的子类必须实现抽象类的抽象方法
- 抽象方法是隐式的虚方法
- 只允许在抽象类中使用抽象方法声明
- 抽象方法在抽象类中没有方法体
- 在抽象方法声明中,不能使用static或者virtual修饰符
- abstract class A //abstract 关键字在class前面
- {
- public abstract void run();//方法是将关键字abstract 添加到方法的返回类型的前面
- }

abstract class A //abstract 关键字在class前面
{
public abstract void run();//方法是将关键字abstract 添加到方法的返回类型的前面
}
- abstract class A
- {
- public virtual void MethodA()
- {
- //do something
- }
- public abstract void run();
- }
- public class B:A
- {
- public override void MethodA()
- {
- //do somthing
- }
- public virtual void run()
- {
- //do something
- }
- }

abstract class A
{
public virtual void MethodA()
{
//do something
}
public abstract void run();
}
public class B:A
{
public override void MethodA()
{
//do somthing
}
public virtual void run()
{
//do something
}
}
- 作为运算符用来创建类的一个对象。 Class obj = new Class();
- 作为修饰符。
- 用于在泛型声明中约束可能用作类型参数的参数类型。(这个不太清楚)
- // Define the base class
- class Car
- {
- public virtual void DescribeCar()
- {
- System.Console.WriteLine("Four wheels and an engine.");
- }
- }
- // Define the derived classes
- class ConvertibleCar : Car
- {
- public new void DescribeCar()
- {
- System.Console.WriteLine("A roof that opens up.");
- }
- }
- class Minivan : Car
- {
- public override void DescribeCar()
- {
- System.Console.WriteLine("Carries seven people.");
- }
- }
- public class Program
- {
- public static void Main()
- {
- Car car1 = new Car();
- car1.DescribeCar();
- System.Console.WriteLine("----------");
- Car car2 = new ConvertibleCar();
- car2.DescribeCar();
- System.Console.WriteLine("----------");
- Car car3 = new Minivan();
- car3.DescribeCar();
- System.Console.WriteLine("----------");
- System.Console.ReadKey();
- }
- }

// Define the base class
class Car
{
public virtual void DescribeCar()
{
System.Console.WriteLine("Four wheels and an engine.");
}
}
// Define the derived classes
class ConvertibleCar : Car
{
public new void DescribeCar()
{
System.Console.WriteLine("A roof that opens up.");
}
} class Minivan : Car
{
public override void DescribeCar()
{
System.Console.WriteLine("Carries seven people.");
}
}
public class Program
{
public static void Main()
{
Car car1 = new Car();
car1.DescribeCar();
System.Console.WriteLine("----------"); Car car2 = new ConvertibleCar();
car2.DescribeCar();
System.Console.WriteLine("----------"); Car car3 = new Minivan();
car3.DescribeCar();
System.Console.WriteLine("----------");
System.Console.ReadKey();
}
}
- class X
- {
- protected virtual void F() { Console.WriteLine("X.F"); }
- protected virtual void F2() { Console.WriteLine("X.F2"); }
- }
- class Y : X
- {
- sealed protected override void F() { Console.WriteLine("Y.F"); }
- protected override void F2() { Console.WriteLine("X.F3"); }
- }
- class Z : Y
- {
- // Attempting to override F causes compiler error CS0239.
- // protected override void F() { Console.WriteLine("C.F"); }//sealed修饰的方法是不允许继承的
- // Overriding F2 is allowed.
- protected override void F2() { Console.WriteLine("Z.F2"); }
- }

class X
{
protected virtual void F() { Console.WriteLine("X.F"); }
protected virtual void F2() { Console.WriteLine("X.F2"); }
}
class Y : X
{
sealed protected override void F() { Console.WriteLine("Y.F"); }
protected override void F2() { Console.WriteLine("X.F3"); }
}
class Z : Y
{
// Attempting to override F causes compiler error CS0239.
// protected override void F() { Console.WriteLine("C.F"); }//sealed修饰的方法是不允许继承的
// Overriding F2 is allowed.
protected override void F2() { Console.WriteLine("Z.F2"); }
}
- namespace testVirtualF
- {
- interface BaseInterface
- {
- void doWork();
- }
- public abstract class Base:BaseInterface
- {
- public virtual void work()
- {
- Console.WriteLine("基类---现在是上班时间");
- }
- public virtual void outWork()
- {
- Console.WriteLine("基类---现在是下班时间");
- }
- public abstract void play();//声明抽象方法,只能在抽象方法中
- public abstract void doWork();//实现接口的抽象类,可以将接口方法映射到抽象方法中
- }
- public class Employer:Base
- {
- public new void work()
- {
- Console.WriteLine("子类(new)---现在是上班时间");
- }
- public override void outWork()
- {
- Console.WriteLine("子类(override)---现在是下班时间");
- }
- public override void play()
- {
- Console.WriteLine("子类(override)---父类抽象方法");
- }
- public override void doWork()
- {
- Console.WriteLine("父类抽象方法--doWork");
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- /*Employer emp = new Employer();
- emp.work();
- emp.outWork();
- emp.play();*/
- /*输出结果
- * 子类(new)---现在是上班时间
- * 子类(override)---现在是下班时间
- */
- /*Employer emp = new Employer();
- Base b = (Base)emp;
- //b.ID = "123";
- b.work();
- b.outWork();
- b.play();*/
- /*执行结果
- * 基类---现在是上班时间
- * 子类(new)---现在是上班时间
- * 子类(override)---现在是下班时间
- */
- Base b = new Employer();
- b.work();
- b.outWork();
- b.play();
- /*执行结果
- * 基类---现在是上班时间
- * 子类(new)---现在是上班时间
- * 子类(override)---现在是下班时间
- */
- }
- }
- }
c#中abstract、override、new、virtual、sealed使用和示例的更多相关文章
- C#--virtual,abstract,override,new,sealed
virtual:使用此关键字,可以使其在派生类中被重写. abstract:抽象方法,由子类重写,或继续为抽象方法存在,并由其子子类实现. override: 重写父类方法,属性,或事件的抽象实现或虚 ...
- Abstract和Virtual和interface , 派生类中重写 override / new关键字
http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html C#中Abstract和Virtual 在C#的学习中,容易混淆virtua ...
- C#中Abstract和Virtual的区别
c# 中 Abstract和Virtual比较容易混淆,都与继承有关,并且涉及override的使用.下面讨论一下二者的区别: 一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰 ...
- C#中Abstract和Virtual
C#中Abstract和Virtual 在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Vi ...
- C#中abstract和virtual区别
在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual ...
- C#中的interface、virtual和abstract
一.Abstract: abstract方法必须在abstarct类中声明,没有默认实现,子类必须实现. 二.Virtual: virtual方法可以声明在abstract类中,也可以声明在非abst ...
- C#中Abstract和Virtual 【转】
http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在 ...
- c#和java中的方法覆盖——virtual、override、new
多态和覆盖 多态是面向对象编程中最为重要的概念之一,而覆盖又是体现多态最重要的方面.对于像c#和java这样的面向对象编程的语言来说,实现了在编译时只检查接口是否具备,而不需关心最终的实现,即最终的实 ...
- C#中Abstract和Virtual[转载]
原文:http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的使用 ...
- 浅析C#中new、override、virtual关键字的区别
Virtual : virtual 关键字用于修饰方法.属性.索引器或事件声明,并使它们可以在派生类中被重写. 默认情况下,方法是非虚拟的.不能重写非虚方法. virtual 修饰符不能与 stati ...
随机推荐
- Advanced Data Structures in competitive programming
1.bit #define isOn(S, j) (S & (1 << j)) #define setBit(S, j) (S |= (1 << j)) #define ...
- [转] JQuery UI Tabs 动态添加页签,并跳转到新页签
[From] https://blog.csdn.net/zhangfeng2124/article/details/76672403 需求: 1.tabs默认只有一个页签,但是需要点击某按钮,动态添 ...
- 有关eval用法的小结
首先要明白eval.这个是可以把字符串代码,直接当做js运行.比如 var ss="alert(1);";这个时候ss保存的是文本. 使用 eval(ss);这样就相当于,执行了s ...
- ibatis配置文件中的XML解析错误The content of elements must consist of well-formed character data or markup.
在检查过所有的标签名都没有问题的情况下. xml中的小于号属于非法字符. SQL语句中则可能需要小于号,此时就需要用<![CDATA[ ]]>将小于号包裹,如此不会被xml解析器解析. ...
- 解决windows10活动历史记录删除问题
Windows10日常办公过程中系统会记录很多活动历史记录信息,我是不希望我的活动历史记录随时可以被别人查看,虽然电脑有设置密码,但是办公电脑还是习惯将历史记录删除掉,并且永远禁用windows10的 ...
- QiyeProject SpringMVC 项目 d15866p148.iok.la 主要做主页应用,消息应用不管了 用户微信号有点像乱码的那个是openID 找同伴:在项目的GitHub页面里找提问过的人,还有fork,star的人
消息型应用支持文本.图片.语音.视频.文件.图文等消息类型. 主页型应用只支持文本消息类型,且文本长度不超过20个字. 填写必要信息 URL /QiyeProject/src/org/oms/qiye ...
- python 爬虫系列09-selenium+拉钩
使用selenium爬取拉勾网职位 from selenium import webdriver from lxml import etree import re import time from s ...
- 东拼西凑 vim配置-更新
"============================================================= "========================== ...
- unity消息队列
解决一些当一些消息事件需要处理时,但是 相应的系统还没有初始化来解决的问题 每个系统执行层也有一个消息队列,这样系统没有做好初始化,不执行就好了. 参考:http://blog.csdn.net/ws ...
- JS中彻底删除json对象组成的数组中的元素
只是分享一个小知识~ 在JS中,对于某个由json对象组成的数组,例如: var test = [{ "a": "1", "b": &quo ...