以下是关于 C# 中父类与子类的核心概念及实践要点总结,结合最新技术实践:

 

------

 

1. 继承基础

 

• 定义:子类(派生类)继承父类(基类)的成员(属性、方法等),但不能继承私有成员(private)和构造函数。

 

【csharp】

 public class Parent {

      protected string Name { get; set; } // 子类可访问

      private int Age { get; set; } // 子类不可访问<x-preset class="no-tts reference-tag disable-to-doc" data-index="1">1</x-preset><x-preset class="no-tts reference-tag disable-to-doc" data-index="4">4</x-preset>

  }

  public class Child : Parent {

      public void PrintName() => Console.WriteLine(Name); // 允许访问父类 protected 成员

  }

  public class Parent {      protected string Name { get; set; }  // 子类可访问      private int Age { get; set; }        // 子类不可访问<x-preset class="no-tts reference-tag disable-to-doc" data-index="1">1</x-preset><x-preset class="no-tts reference-tag disable-to-doc" data-index="4">4</x-preset>  }  public class Child : Parent {      public void PrintName() => Console.WriteLine(Name);  // 允许访问父类 protected 成员  }

 

------

 

2. 访问控制与关键字

 

• 访问修饰符:

 

• private:仅父类内部可访问。

 

• protected:子类可访问,但无法通过父类实例访问(如 parent.ProtectedMember 无效)。

 

• public:所有类可访问。

 

• base 与 this:

 

• base:访问父类被隐藏的成员(如同名方法或属性)。

 

• this:访问当前类的成员。

 

【csharp】

 public class Parent {

      public virtual void Show() => Console.WriteLine("Parent");

  }

  public class Child : Parent {

      public override void Show() {

          base.Show(); // 调用父类方法

          Console.WriteLine("Child");

      }

  }

 

------

 

3. 方法重写与隐藏

 

• 虚方法(Virtual/Override):

 

父类声明 virtual 方法,子类通过 override 覆盖实现多态性。  

 

【csharp】

 public class Parent {

      public virtual void Print() => Console.WriteLine("Parent");

  }

  public class Child : Parent {

      public override void Print() => Console.WriteLine("Child"); // 多态调用

  }

 

• 隐藏(New):

 

子类声明同名方法时使用 new 关键字,父类方法在子类中被隐藏(非多态)。  

 

【csharp】

 public class Child : Parent {

      public new void Print() => Console.WriteLine("Child"); // 隐藏父类方法

  }

 

------

 

4. 构造函数与初始化

 

• 构造函数调用:

 

• 子类默认调用父类的无参构造函数。

 

• 若父类无无参构造函数,子类必须通过 base 显式调用父类有参构造函数。

 

【csharp】

 public class Parent {

      public Parent(string name) { /* ... */ }

  }

  public class Child : Parent {

      public Child(string name, int age) : base(name) { // 显式调用父类构造函数

          this.Age = age;

      }

  }

 

------

 

5. 类型转换

 

• 向上转换:子类可隐式转换为父类类型(安全操作)。

 

【csharp】

 Child child = new Child();

  Parent parent = child; // 隐式转换

 

• 向下转换:父类需显式强制转换为子类类型(可能抛出 InvalidCastException)。

 

【csharp】

 if (parent is Child child) {

      child.SpecialMethod(); // 安全转换(推荐使用 as 关键字)

  }

 

------

 

6. 父类调用子类方法的技巧

 

• 虚方法重写:父类定义虚方法,子类实现具体逻辑(符合多态原则)。

 

• 反射(不推荐):动态调用子类特有方法(破坏封装性,慎用)。

 

------

 

7. 设计建议

 

• 单一继承:C# 不支持多继承,但可通过接口(interface)实现多态。

 

• 避免过度继承:优先使用组合而非继承,降低耦合度。

 

------

 

总结

 

• 核心原则:子类继承父类非私有成员,通过 virtual/override 实现多态,合理使用 base 和 new 处理成员冲突。

 

• 实践场景:如需要扩展现有类功能(如日志系统、权限管理模块)时,继承可显著提升代码复用性。

 

通过以上规则,可高效管理类层次结构并实现灵活的业务逻辑设计。

更多推荐