封装
对象的内部数据不应该从对象的实例直接访问,如果调用者想改变对象的状态就要使用访问方法(getter)和修改方法(setter),封装提供了一种保护状态数据完整性的方法,可用于验证输入数据是否符合业务规则。
- 实现方式
- 访问方法和修改方法
- 属性
继承
新的类可以从其他类中继承利用他们既有的功能。这是通过以下方式实现的:在声明类时,在类名称后放置一个冒号,然后在冒号后指定要从中继承的类(即基类)。
- 语法
public class A
{
public A() { }
}
public class B : A
{
public B() { }
}
|
- 代码重用
-
- is-a:继承
- has-a:包含、委托模型
- 基类
一个类只能有一个直接的基类,子类将继承基类的所有非私有功能,但可以继承多个接口,这样可以构造灵活的接口层次来建模复杂的行为。
-
- 初始化调用
-
- 关键字
-
- base:子类需要调用基类的字段或方法时可以使用该关键字
- 密封类
-
- 关键字
-
- sealed
- 代码示例
public sealed class D
{
// Class members here.
}
|
- 嵌套类
-
- 语法
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();
|
多态
通过继承,一个类可以用作多种类型:可以用作它自己的类型、任何基类型,或者在实现接口时用作任何接口类型。这称为多态性。C# 中的每种类型都是多态的。类型可用作它们自己的类型或用作 Object 实例,因为任何类型都自动将 Object 当作基类型。
- 方法重写
-
- 关键字
-
- virtual:基类中的需要子类实现的方法可以使用该关键字
- override:派生类需要实现基类中的方法可以使用该关键字
- 成员投影
-
- 关键字
-
- new
- 密封虚成员
-
- 关键字
-
- sealed:使用 sealed 关键字可以防止继承以前标记为 virtual 的类或某些类成员。
- 代码示例
public class D : C
{
public sealed override void DoWork() { }
}
|
- 抽象类
抽象类不能实例化,抽象类的用途是提供多个派生类可共享的基类的公共定义,可用于建模。
-
- 关键字
-
- abstract :使用 abstract 关键字可以创建仅用于继承用途的类和类成员,即定义派生的非抽象类的功能。
- 抽象方法
-
- 代码示例
public abstract class A
{
public abstract void DoWork(int i);
}
|
-
- 虚方法声明为抽象
如果将虚方法声明为抽象方法,则它对于从抽象类继承的所有类而言仍然是虚的。继承抽象方法的类无法访问该方法的原始实现。在前面的示例中,类 F 上的 DoWork 无法调用类 D 上的 DoWork。在此情况下,抽象类可以强制派生类为虚方法提供新的方法实现。
// 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.
}
}
|
- 多态接口
定义一个抽象类并定义许多抽象成员,这样派生类必须实现所有的抽象成员,也就强制了每一个后代具有的多态接口。
- 基类和派生类的转换规则
-
- 规则一:可以使用基类保存任意的派生类型,并且这是安全的,这叫做隐式转换。
- 规则二:反之,需要使用强制转换操作符进行显示的向下转换。