一、类的继承※
在 C# 中,继承(inheritance)是面向对象编程的重要特性,允许一个类(子类)从另一个类(父类)继承属性和行为。子类可以继承父类的字段、属性、方法和事件,并且可以通过重写方法和定义新方法来扩展或修改父类的行为。以下是 C# 中继承的主要特点和用法:
1. 派生类和基类:※
在 C# 中,派生类(子类)通过冒号 : 来指定一个基类(父类)并继承其成员。派生类会继承基类的非私有成员(如公共、受保护、内部),但不能继承基类的构造函数和析构函数。
public class Animal {
public void Eat() {
Console.WriteLine("Animal is eating.");
}
}
public class Dog : Animal {
public void Bark() {
Console.WriteLine("Dog is barking.");
}
}
2. 重写方法:※
子类可以通过 override 关键字重写从基类继承的虚拟方法。重写的方法必须具有与基类方法相同的签名,并且必须标记为 virtual 或 abstract (需要在基类中声明)。
public class Animal {
public virtual void Move() {
Console.WriteLine("Animal is moving.");
}
}
public class Dog : Animal {
public override void Move() {
Console.WriteLine("Dog is moving.");
}
}
3. 访问修饰符:※
继承时,派生类中不能访问基类中的私有成员。而公共( public )、受保护( protected )、内部( internal )等类型的成员可以被子类访问。
4. 多态性:※
继承可以实现多态性,即通过基类的引用来调用子类对象的方法。这使得代码更灵活,可以在运行时动态绑定不同的实现。
Animal someAnimal = new Dog();
someAnimal.Move(); // 虚方法重写实现多态性
继承是面向对象编程中的重要概念,通过继承可以实现代码的重用和扩展。在设计时,应该注意尽量遵循单一职责原则和Liskov 替换原则,避免过度继承导致复杂的类层次结构,同时合理使用多态性,以提高代码的可维护性和灵活性。
二、所有的类继承Object※
在 C# 中,所有类都直接或间接地继承自 System.Object 类,也就是说 System.Object 是所有类的根类。在 C# 中, System.Object 类提供了一些重要的成员和方法,包括以下几个常见的成员:
- ToString() 方法: ToString() 方法是 System.Object 类中定义的虚拟方法,用于返回表示当前对象的字符串表示形式。类可以重写 ToString() 方法以提供自定义的字符串表示。
- Equals() 和 GetHashCode() 方法: Equals() 方法用于比较两个对象是否相等,而GetHashCode() 方法用于获取对象的哈希码。类可以重写这两个方法以提供自定义的相等性比较行为。
- GetType() 方法: GetType() 方法用于获取当前对象的类型信息,返回一个表示实例类型的System.Type 对象。
- 其他方法: System.Object 类还包含一些其他方法,例如 ReferenceEquals() 方法用于比较两个对象的引用是否相同,还有一些操作符重载如 == 和 != 等。
由于所有类都隐式继承自 System.Object ,所以所有类都可以使用 System.Object 中定义的这些成员。这为 C# 中的所有对象提供了一些基本的通用行为和特性,使代码更加一致且易于理解。
以下是一个简单的示例演示了所有类在 C# 中隐式继承自 System.Object 类:
using System;
public class MyClass {
public void MyMethod() {
Console.WriteLine("MyMethod called");
}
}
public class Program {
public static void Main() {
MyClass obj = new MyClass();
// 使用继承自System.Object的方法
Console.WriteLine(obj.ToString());
Console.WriteLine(obj.GetType().Name);
// 使用自定义方法
obj.MyMethod();
}
}
在 C# 中,所有类都直接或间接地继承自 System.Object 类,这样确保了统一的基类结构,使得编程更加便捷和一致。