1. 继承
<span style="font-size:14px;">public class A
{
}
public class B: A
{
}</span>
A:基类;B:派生类
派生类将获取基类的所有非私有数据和行为以及派生类为自己定义的所有其他数据和行为。因此,派生类具有两个有效类型:派生类的类型和它继承的类的类型。
在上面的示例中,类B既是有效的B,又是有效的A。访问B对象时,可以使用强制转换操作将其转换为A对象。强制转换不会更改B对象,但您的B对象视图将限制为A的数据和行为。将B强制转换为A后,可以将A重新强制转换为B。并非A所有示例都可强制转换为B,只有实际上是B的实例的那些实例才可以强制转换为B。如果将类B作为B类型访问,则可以同时获得类A和类B的数据和行为。
结构不能从其他结构或类中继承。类和结构都可以从一个或多个接口中继承。
2.多态性
对象可以表示多个类型的能力称为多态性。通过继承,一个类 可以用在多个类型:可以用在它自己的类型、任何基类型,或者在实现接口时用作任何接口类型。这称为多态性。
C#中的每种类型都是多态的。类型可用作它们自己的类型或用作Object实例,因为任何类型都自动将Object 当做基类。
3.抽象类和类成员
声明:
在类声明中使用abstract 修饰符以指示某个类只能是其他类的基类。
public abstract class A:
{
public abstract void Dowork(int i);
}
派生:
public class B:A
{
public override void Dowork(int i)
{
// New implementation
}
}
抽象类特性:
抽象类不能实例化
抽象类不能是密封的或静态的
抽象类中可以包含虚方法和非抽象方法
抽象类的派生类可以是抽象类或非抽象类
从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现
抽象方法特性
抽象方法是隐式的虚方法
抽象方法只能存在于抽象类中
在抽象方法声明上使用static 或 virtual修饰符是错误的
抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号{}
当抽象类从基类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。例如:
public class D
{
public virtual void Dowork(int i)
{
// Original implementation
}
}
public abstract class E :D
{
public abstract override void Dowork(int);
}
public class F :E
{
public override void Dowork(int i)
{
// New implementation
<span style="font-family: Arial, Helvetica, sans-serif;"> }</span>
}
如果将虚方法声明为抽象方法,则它对于从抽象类继承的所有类而言仍然是虚的。继承抽象方法的类无法访问该方法的原始实现。在前面的示例中,类 F 上的 DoWork 无法调用类 D 上的 DoWork。在此情况下,抽象类可以强制派生类为虚方法提供新的方法实现。
4.密封类
声明
在类声明中使用sealed修饰符以指示某个类为密封类
public sealed class D
{
}
密封类不能用在基类,因此,它也不能是抽象类。
结构是隐式密封的,因此不能被继承
密封成员
在对基类的虚成员进行重写的派生类上的类成员、方法、字段、属性或事件可以将该成员声明为密封成员。在用于以后的派生类时,这将取消成员的虚效果。方法是在类成员声明中将 sealed 关键字置于 override 关键字的前面。
当应用于方法或属性时,sealed 修饰符必须始终与 override 一起使用。
5. 虚拟成员
virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。
虚拟成员可以有自己的实现。
虚拟成员可以有派生类重写。
默认情况下,方法是非虚拟的。不能重写虚拟方法。
virtual 修饰符不能与static, abstract, private 或 override 修饰符一起使用
6.重写
要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。
override 方法提供从基类继承的成员的新实现。由 override 声明重写的方法称为重写基方法。重写的基方法必须与 override 方法具有相同的签名
不能重写非虚方法或静态方法。重写的基方法必须是 virtual、abstract 或 override 的。
不能使用 new、static、virtual 或 abstract 修饰符来修改 override 方法。
不能使用 new、static、virtual 或 abstract 修饰符来修改 override 方法。
7.隐藏
new 关键字可以显式隐藏从基类继承的成员。隐藏继承的成员时,该成员的派生版本将替换基类版本。虽然可以在不使用 new 修饰符的情况下隐藏成员,但会生成警告。如果使用 new 显式隐藏成员,则会取消此警告,并记录要替换为派生版本这一事实。
通过继承隐藏名称采用下列形式之一:
-
引入类或结构中的常数、指定、属性或类型隐藏具有相同名称的所有基类成员。
-
引入类或结构中的方法隐藏基类中具有相同名称的属性、字段和类型。同时也隐藏具有相同签名的所有基类方法。
-
引入类或结构中的索引器将隐藏具有相同名称的所有基类索引器。
在 C# 中,派生类可以包含与基类方法同名的方法。
-
基类方法必须定义为 virtual。
-
如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作。
-
如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法。
-
如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不是调用基类方法。
-
可以从派生类中使用 base 关键字调用基类方法。
-
override、virtual 和 new 关键字还可以用于属性、索引器和事件中。