深入理解类的高级特性与继承机制
立即解锁
发布时间: 2025-08-21 00:06:04 阅读量: 1 订阅数: 5 


C#编程基础与实战技巧
# 深入理解类的高级特性与继承机制
## 1. 部分类与部分类型
### 1.1 部分类的定义
类的声明可以分割成多个部分类声明,每个部分类声明包含类的一些成员声明。部分类声明可以位于同一个文件或不同文件中,但每个部分声明都必须标记为 `partial class`。
```csharp
partial class MyPartClass // 与下面的类名相同
{
member1 declaration
member2 declaration
...
}
partial class MyPartClass // 与上面的类名相同
{
member3 declaration
member4 declaration
...
}
```
### 1.2 部分类的特点
- 所有构成一个类的部分类声明必须一起编译。
- 使用部分类声明的类与所有类成员在单个类声明体中声明的类具有相同的含义。
### 1.3 部分类的应用场景
Visual Studio 在其标准 Windows 程序模板中使用了部分类特性。创建 ASP.NET 项目或 Windows Forms 项目时,模板会为每个网页或表单创建两个类文件:
- 一个文件包含由 Visual Studio 生成的代码的部分类,声明页面上的组件,不建议修改该文件中的部分类。
- 另一个文件包含用于实现页面或表单组件外观和行为的部分类。
### 1.4 其他部分类型
除了部分类,还可以创建部分结构体和部分接口。
## 2. 部分方法
### 2.1 部分方法的定义
部分方法是在部分类的两个部分中声明的方法,两个部分可以在部分类的不同部分或同一部分声明。部分方法由定义部分和实现部分组成:
- 定义部分:给出签名和返回类型,实现部分仅包含分号。
- 实现部分:给出签名和返回类型,实现为正常的语句块。
### 2.2 部分方法的重要特性
- 定义和实现声明的签名和返回类型必须匹配,且具有以下特点:
- 上下文关键字 `partial` 必须在 `void` 关键字之前包含在定义和实现声明中。
- 签名不能包含访问修饰符,部分方法隐式为私有。
- 返回类型必须为 `void`。
- 参数列表不能包含 `out` 参数。
- 可以有定义部分而没有实现部分,此时编译器会移除声明和类内部对该方法的任何调用。但如果类有实现部分,则必须有定义部分。
### 2.3 部分方法示例
```csharp
partial class MyClass
{
partial void PrintSum(int x, int y); // 定义部分方法
public void Add(int x, int y)
{
PrintSum(x, y);
}
}
partial class MyClass
{
partial void PrintSum(int x, int y) // 实现部分方法
{
Console.WriteLine("Sum is {0}", x + y);
}
}
class Program
{
static void Main()
{
var mc = new MyClass();
mc.Add(5, 6);
}
}
```
输出结果:
```
Sum is 11
```
## 3. 类的继承
### 3.1 继承的基本概念
继承允许定义一个新类,该类合并并扩展已声明的类。可以使用现有类(基类)作为新类(派生类)的基础,派生类的成员包括自身声明的成员和基类的成员。
### 3.2 派生类的声明
要声明派生类,在类名后添加类基规范,类基规范由冒号和用作基类的类名组成。
```csharp
class OtherClass : SomeClass
{
...
}
```
### 3.3 继承的特点
- 派生类扩展其基类,包含基类的成员和自身声明的额外功能。
- 派生类不能删除继承的任何成员。
### 3.4 继承关系示例
```mermaid
graph TD;
A[SomeClass] --> B[OtherClass];
```
## 4. 访问继承的成员
继承的成员可以像在派生类中声明一样访问。以下代码展示了如何访问继承的成员:
```csharp
class SomeClass // 基类
{
public string Field1 = "base class field ";
public void Method1( string value ) {
Console.WriteLine("Base class -- Method1: {0}", value);
}
}
class OtherClass: SomeClass // 派生类
{
public string Field2 = "derived class field";
public void Method2( string value ) {
Console.WriteLine("Derived class -- Method2: {0}", value);
}
}
class Program
{
static void Main() {
OtherClass oc = new OtherClass();
oc.Method1( oc.Field1 ); // 基类方法使用基类字段
oc.Method1( oc.Field2 ); // 基类方法使用派生类字段
oc.Method2( oc.Field1 ); // 派生类方法使用基类字段
oc.Method2( oc.Field2 ); // 派生类方法使用派生类字段
}
}
```
输出结果:
```
Base class -- Method1: base class field
Base class -- Method1: derived class field
Derived class -- Method2: b
```
0
0
复制全文
相关推荐









