sealed、new、virtual、abstract与override 趣解(6)

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

1. sealed——“断子绝孙”

    密封类不能被继承。密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于

方法或属性时,sealed修饰符必须始终与override一起使用。

即:密封类不会有子类,所以是“断子绝孙”。

2. new——“你是你的,我是我的”

    new关键字用于显式隐藏从基类继承的成员。也就是在使用派生类时调用的方式方法是new关键字新定义出

来的方法,而不是基类的方法。

    在不使用new修饰符的情况下隐藏成员是允许的,但会生成警告。使用new显式隐藏成员会取消此警告,并

使用派生类新定义的方法。

即:好比是不用祖宗的东西,而是用自己创造(new)的东西。

3. virtual——“为了子孙后代”

    virtual关键字用于修改方法或属性的声明,在这种情况下,方法或属性被称做虚成员。虚成员的实现可由

派生类中的重写成员更改。

    调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派

生类重写该成员,则它可能是原始成员。

    在默认情况下,方式是非虚拟的。非虚方法不能重写。

    不能将virtual修饰符与一下修饰符一起使用:staticabstractoverride

    除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。

    在静态属性上使用virtual修饰符是错误的。

    通过override修饰符的属性声明,在派生类中重写虚拟继承属性。

即:virtual是为了让子孙后代可以实现各自的梦想而做的。

4. abstract——“我是上帝”

    abstract修饰符可以和类、方法、属性、索引器及事件一起使用。

    在类声明中使用abstract修饰符,以指示该类只能是其他类的基类。标记为抽象或包含在抽象类中的成员

必须通过从抽象类派生的类来实现。

    抽象类具有以下特性:

    抽象类不能实例化。

    抽象类可以包含抽象方法和抽象访问器。

    不能用sealed修饰符修改抽象类,这意味着该类不能被继承。

    从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现。

    在方法或属性声明中使用abstract修饰符以指示此方法或属性不包含实现。

    抽象方法具有以下特性:

    抽象方法是隐式的virtual方法。

    只允许在抽象类使用抽象方法声明。

    抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在结束后

没有花括号。

    实现由override方法提供,它是非抽象类的成员。

    在抽象方法声明中使用staticvirtual修饰符是错误的。

    除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。

    在静态属性上使用abstract修饰符是错误的。

    在派生类中,通过包括使用override修饰符的属性声明可以重写抽象的基础属性。

即:abstract是一种抽象,好比上帝,是人们对神的抽象,看似什么都能干,其实什么都干不了。

5. override——“一手遮天”

    使用override修饰符来修改方法、属性、索引器或事件。主要是提供派生类对基类方法的新实现。覆盖

上面abstractvirtual两种关键字修饰的成员。

    由重写声明重写的方法称为重写基方法。重写基方法必须与重写方法具有相同的签名。

    重写基方法必须是虚拟的、抽象或重写的。不能重写非虚方法或静态方法。

    不能使用下列修饰符修改重写方法:newstaticvirtualabstract

    重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且重写属性必须是虚拟的、

抽象的或重写的。

即:override好比不但不用祖宗的那套,而且还自己创一套新功夫代替祖宗那套。

6、newoverride的区别如下:

    override的基类方法必须要用virtual,而new不必要。

    用一个基类的对象调用基类的virtual方法时,override重写的派生类的方法会被访问,而new重写的派生

类中的方法不会被访问。

资料来源:《.NET深入体验与实战精要》 李天平 著

 

时间: 2024-10-28 02:24:10

sealed、new、virtual、abstract与override 趣解(6)的相关文章

c#中virtual, abstract和override的区别和用法

virtual是把一个方法声明为虚方法,使派生类可重写此方法,一般建立的方法是不能够重写的,譬如类A中有个方法protected void method(){ 原代码....;}类B继承自类A,类B能够调用类A的method()方法,但不能更改方法体代码,但当类A中使用了virtual声明此方法: protected virtual void method(),那么类B可通过使用override重写此方法protected override void method(){ 新代码....;}vir

sealed、new、virtual、abstract与override 总结

原文地址:http://www.cnblogs.com/DebugLZQ/archive/2011/08/09/2132468.html 1. sealed--"断子绝孙" 密封类不能被继承.密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写.当应用于方法或属性时,sealed修饰符必须始终与override一起使用. 即:密封类不会有子类,所以是"断子绝孙". 2. new--"你是我的,我是我的" new关键字用于显式隐藏从基

c#中abstract、override、new、virtual、sealed使用和示例

原文地址:http://blog.csdn.net/richerg85/article/details/7407544 abstract      修饰类名为抽象类,修饰方法为抽象方法.如果一个类为抽象类,则这个类智能是其他某个类的基类.抽象方法在抽象类中没有函数体.抽象类中的抽象方法是没有方法体的,继承其的子类必须实现抽象类的抽象方法. 抽象类有如下特征: 抽象类不能实例化 抽象类的派生类必须实现所有抽象方法 抽象类中的抽象方法是没有方法体的,继承其的子类必须实现抽象类的抽象方法 抽象方法:

第58讲:Scala中Abstract Types实战详解

package com.parllay.scala.type_parameterizitor import scala.io.{Source, BufferedSource} /** * Created by richard on 15-8-17. * 第58讲:Scala中Abstract Types实战详解 */ /** * scala里的类型,除了在定义class,trait,object时会产生类型, * 还可以通过type关键字来声明类型. type相当于声明一个类型别名: scala

设计模式 - 抽象工厂模式(abstract factory pattern) 详解

抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 参考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要明确指定具体类. 全部代码: http://download.csdn.net/de

C#--virtual,abstract,override,new,sealed

virtual:使用此关键字,可以使其在派生类中被重写. abstract:抽象方法,由子类重写,或继续为抽象方法存在,并由其子子类实现. override: 重写父类方法,属性,或事件的抽象实现或虚方法. new:显式隐藏从父类继承的成员. 后台代码: public abstract class Animal { public abstract void Eat(); public virtual void Sleep() { HttpContext.Current.Response.Writ

c#中抽象类,interface,abstract、override、virtual、sealed使用

interface:接口声明不包括数据成员,只能包含方法,属性,事件,索引等成员,使用接口时不能声明抽象成员(不能直接new实例化) public interface IStringList //接口一般用I作为首字母 { //接口声明不包括数据成员,只能包含方法.属性.事件.索引等成员 //使用接口时不能声明抽象成员(不能直接new实例化) void Add ( string s ) ; int Count{ get; } string this[int index] { get; set;

virtual abstract override

virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能私有的.毕竟加上virtual或abstract就是让子类重新定义的,而private成员是不能被子类访问的. 但是它们的区别很大.(virtual是“虚拟的”,abstract是“抽象的"). (1)virtual修饰的方法必须有实现(哪怕是仅仅添加一对大括号),而abstract修饰的方法一定不

abstract virtaul override new 及多态

abstract abstract 修饰符可以和类.方法.属性.索引器及事件一起使用.在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类.标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现. 抽象类具有以下特性: 抽象类不能实例化. 抽象类可以包含抽象方法和抽象访问器. 不能用 sealed(C# 参考) 修饰符修改抽象类,因为 sealed 会使得抽象类无法被继承. 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现. 抽象方法具有以下特性: