c#基类
时间: 2025-04-24 18:12:26 浏览: 27
### C# 中基类的概念和用法
#### 定义与特性
在C#中,基类是用于定义共享属性和行为的基础类。任何继承自该基类的派生类都将拥有这些共同特征。通过这种方式,可以实现代码重用并简化程序结构。
- **单一继承**:C#支持单继承机制,即一个类只能有一个直接父级(基类)。然而,这并不妨碍间接多重继承的可能性——如果某个类是从另一个已经继承了多个接口或抽象类而来的具体类派生的话。
- **构造函数调用**:当创建派生类的对象时,默认情况下会先执行最顶层祖先类的无参构造器;之后依次向下直到当前层为止。可以通过`base()`显式指定要使用的特定版本[^1]。
```csharp
// 基类A及其默认构造函数
public class A {
public A() => Console.WriteLine("Building A");
}
// 继承自A的子类B,并显示调用了A的构造函数
public class B : A{
public B() : base() => Console.WriteLine("Building B");
}
```
#### 方法覆盖与多态性
为了使不同层次上的同名成员能够表现出差异化的功能表现形式,在设计阶段就需要考虑好哪些部分应该允许后代修改以及如何控制这种变化范围:
- 当希望让派生类提供自己特有的实现方式来替代原有定义,则应采用关键字`override`标记相应位置处的新版声明语句。此时原形体需事先声明为virtual或者abstract以便留有余地给后续发展[^4]。
```csharp
using System;
namespace VirtualMethodExample {
// 抽象基类Animal提供了walk方法作为虚拟成员供子类覆写
abstract class Animal {
public virtual void Walk(){
Console.WriteLine("The animal walks.");
}
}
// Dog类实现了来自Animal的具体行走动作描述
sealed class Dog : Animal {
public override void Walk(){
Console.WriteLine("Dog runs around happily!");
}
}
internal class Program {
private static void Main(string[] args){
var myPet = new Dog();
myPet.Walk(); // 输出 "Dog runs around happily!"
}
}
}
```
另一方面,有时仅想改变名称空间内的局部含义而不影响全局解释规则,这时就可以利用`new`修饰符来进行隐藏操作而非真正意义上的替换旧有的逻辑流程[^3]。
```csharp
class Bird : Animal {
// 这里不是重写了Walk而是新定义了一个相同签名的方法
new public void Walk(){
Console.WriteLine("Bird flies instead of walking.");
}
}
```
#### 触发基类事件
除了上述基本概念外,还有一种场景涉及到跨层级间的信息传递问题,比如想要在一个衍生出来的实体内部处理某些特殊状况的同时通知到更高级别的管理者那里去知晓情况进展。为此目的所设立的就是所谓的“事件”,它允许较低级别的组件向监听者发送信号告知发生了什么事情。
下面的例子展示了怎样从派生类中触发由基类定义好的事件处理器件[^2]。
```csharp
using System;
using EventArgs = System.EventArgs;
/// <summary>
/// 表达了一种具有可观察性质的行为模式
/// </summary>
internal class ObservableAction<T> where T : EventArgs {
/// <summary>
/// 发布消息给所有订阅方知道某事发生过了
/// </summary>
public event EventHandler<T>? Occurred;
protected virtual void RaiseOccurrence(T e) =>
Occurred?.Invoke(this, e);
}
/// <summary>
/// 描述了一个具体的行动过程
/// </summary>
sealed class ConcreteActivity : ObservableAction<EventArgs> {
/// <summary>
/// 执行实际的任务工作
/// </summary>
public void PerformTask(){
try{/*...*/}
finally{// 不管成功与否都要报告状态更新
this.RaiseOccurrence(new EventArgs());
}
}
}
```
阅读全文
相关推荐









