封装
- 实现方式
- 访问方法和修改方法
- 属性
继承
- 语法
public class A
{
public A() { }
}
public class B : A
{
public B() { }
}
|
- 代码重用
-
- is-a:继承
- has-a:包含、委托模型
- 基类
-
- 初始化调用
默认在子类的构造函数执行之前调用基类的构造函数,之后为基类的公共属性创建状态。实现子类时最好是显示的调用合适的基类的构造函数,减少对继承的初始化成员的调用次数。
-
- 关键字
-
- base:子类需要调用基类的字段或方法时可以使用该关键字
- 密封类
密封类是不可以被继承的,在设计工具类时对类进行密封是很有意义的
-
- 关键字
-
- sealed
- 代码示例
public sealed class D
{
// Class members here.
}
|
- 嵌套类
在类或结构内部定义的类型称为嵌套类型,不管外部类型是类还是结构,嵌套类型均默认为 private,但是可以设置为 public、protected internal、protected、internal 或 private。嵌套类型(或内部类型)可访问包含类型(或外部类型)。
-
- 语法
class Container
{
class Nested
{
Nested() { }
}
}
|
-
- 访问包含类型
将其作为构造函数传递给嵌套类型
public class Container
{
public class Nested
{
private Container m_parent;
public Nested()
{
}
public Nested(Container parent)
{
m_parent = parent;
}
}
}
|
-
- 实例化
Container.Nested nest = new Container.Nested();
|
多态
- 方法重写
由子类重新定义基类中的方法,可使用base关键字调用基类的方法
-
- 关键字
-
- virtual:基类中的需要子类实现的方法可以使用该关键字
- override:派生类需要实现基类中的方法可以使用该关键字
- 成员投影
如果子类中定义了一个成员与基类的成员一致,则我们称之为成员投影。可以使用new关键字调用新成员而不是被替换的旧成员,将子类实例强制转换成基类实例时才可以调用隐藏的基类成员。一般在无法更改基类代码的情况下可以使用此方法进行成员替换。
-
- 关键字
-
- new
- 密封虚成员
用于密封从基类继承的虚方法,以防止本类的派生类重写此方法。
-
- 关键字
-
- sealed:使用 sealed 关键字可以防止继承以前标记为 virtual 的类或某些类成员。
- 代码示例
public class D : C
{
public sealed override void DoWork() { }
}
|
- 抽象类
-
- 关键字
-
- abstract :使用 abstract 关键字可以创建仅用于继承用途的类和类成员,即定义派生的非抽象类的功能。
- 抽象方法
抽象类也可以定义抽象方法。方法是将关键字 abstract 添加到方法的返回类型的前面。抽象方法没有实现,所以方法定义后面是分号,而不是常规的方法块。抽象类的派生类必须实现所有抽象方法。当抽象类从基类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。
-
- 代码示例
public abstract class A
{
public abstract void DoWork(int i);
}
|
-
- 虚方法声明为抽象
// compile with: /target:librarypublic class D
{
public virtual void DoWork(int i)
{
// Original implementation.
}
}
public abstract class E : D
{
public abstract override void DoWork(int i);
}
public class F : E
{
public override void DoWork(int i)
{
// New implementation.
}
}
|
- 多态接口
- 基类和派生类的转换规则
-
- 规则一:可以使用基类保存任意的派生类型,并且这是安全的,这叫做隐式转换。
- 规则二:反之,需要使用强制转换操作符进行显示的向下转换。