sealed、new、virtual、abstract与override 趣解
1. sealed——“断子绝孙” 密封类不能被继承。密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于 方法或属性时,sealed修饰符必须始终与override一起使用。 即:密封类不会有子类,所以是“断子绝孙”。 2. new——“你是你的,我是我的” new关键字用于显式隐藏从基类继承的成员。也就是在使用派生类时调用的方式方法是new关键字新定义出 来的方法,而不是基类的方法。 在不使用new修饰符的情况下隐藏成员是允许的,但会生成警告。使用new显式隐藏成员会取消此警告,并 使用派生类新定义的方法。 即:好比是不用祖宗的东西,而是用自己创造(new)的东西。 3. virtual——“为了子孙后代” virtual关键字用于修改方法或属性的声明,在这种情况下,方法或属性被称做虚成员。虚成员的实现可由 派生类中的重写成员更改。 调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派 生类重写该成员,则它可能是原始成员。 在默认情况下,方式是非虚拟的。非虚方法不能重写。 不能将virtual修饰符与一下修饰符一起使用:static、abstract和override。 除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。 在静态属性上使用virtual修饰符是错误的。 通过override修饰符的属性声明,在派生类中重写虚拟继承属性。 即:virtual是为了让子孙后代可以实现各自的梦想而做的。 4. abstract——“我是上帝” abstract修饰符可以和类、方法、属性、索引器及事件一起使用。 在类声明中使用abstract修饰符,以指示该类只能是其他类的基类。标记为抽象或包含在抽象类中的成员 必须通过从抽象类派生的类来实现。 抽象类具有以下特性: 抽象类不能实例化。 抽象类可以包含抽象方法和抽象访问器。 不能用sealed修饰符修改抽象类,这意味着该类不能被继承。 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现。 在方法或属性声明中使用abstract修饰符以指示此方法或属性不包含实现。 抽象方法具有以下特性: 抽象方法是隐式的virtual方法。 只允许在抽象类使用抽象方法声明。 抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在结束后 没有花括号。 实现由override方法提供,它是非抽象类的成员。 在抽象方法声明中使用static或virtual修饰符是错误的。 除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。 在静态属性上使用abstract修饰符是错误的。 在派生类中,通过包括使用override修饰符的属性声明可以重写抽象的基础属性。 即:abstract是一种抽象,好比上帝,是人们对神的抽象,看似什么都能干,其实什么都干不了。 5. override——“一手遮天” 使用override修饰符来修改方法、属性、索引器或事件。主要是提供派生类对基类方法的新实现。覆盖 上面abstract、virtual两种关键字修饰的成员。 由重写声明重写的方法称为重写基方法。重写基方法必须与重写方法具有相同的签名。 重写基方法必须是虚拟的、抽象或重写的。不能重写非虚方法或静态方法。 不能使用下列修饰符修改重写方法:new、static、virtual和abstract。 重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且重写属性必须是虚拟的、 抽象的或重写的。 即:override好比不但不用祖宗的那套,而且还自己创一套新功夫代替祖宗那套。 6、new和override的区别如下: 用override的基类方法必须要用virtual,而new不必要。 用一个基类的对象调用基类的virtual方法时,override重写的派生类的方法会被访问,而new重写的派生 类中的方法不会被访问。
资料来源:《.NET深入体验与实战精要》 李天平 著