在C#中如何仅继承抽象类的部分成员而非全部?
解决方法
C#的继承规则是:子类会继承基类所有非private的成员,无法直接选择性继承特定成员。要实现你只获取result变量和NumbersAdd()方法的需求,只能通过调整基类访问修饰符或重构基类结构来实现,以下是两种可行方案:
方案1:修改原基类的访问修饰符(推荐,若允许修改原基类)
把不需要暴露给子类的成员(如numberOne、numberTwo、NumbersMultiply())的访问修饰符改为protected或private:
protected:仅基类和子类内部可访问,外部代码看不到这些成员private:仅基类内部可访问,子类完全无法访问
修改后的BaseScript代码:
public abstract class BaseScript : MonoBehaviour { // 改为protected,若不想让子类内部访问则改为private protected float numberOne = 5f; protected float numberTwo = 10f; public float result; public void NumbersAdd() { result = numberOne + numberTwo; } // 同样改为protected或private protected void NumbersMultiply() { result = numberOne * numberTwo; } }
此时子类InheritingScript : BaseScript继承后,外部代码只能看到result和NumbersAdd(),彻底解决成员杂乱的问题。
方案2:重构基类为层级结构(若无法修改原基类)
将需要被子类继承的核心成员提取到一个独立的抽象类,让原BaseScript继承这个新类,同时子类直接继承这个新的抽象类,实现成员的隔离:
// 仅包含需要的核心成员的基础抽象类 public abstract class BaseAddCore : MonoBehaviour { public float result; // 抽象属性让子类/上层基类提供计算所需的数值 protected abstract float NumberOne { get; } protected abstract float NumberTwo { get; } public void NumbersAdd() { result = NumberOne + NumberTwo; } } // 原基类继承基础类,保留原有全部功能 public abstract class BaseScript : BaseAddCore { protected override float NumberOne => 5f; protected override float NumberTwo => 10f; public void NumbersMultiply() { result = NumberOne * NumberTwo; } } // 子类仅继承基础类,只获取需要的成员 public class InheritingScript : BaseAddCore { // 根据需求重写数值,或复用原逻辑 protected override float NumberOne => 5f; protected override float NumberTwo => 10f; }
内容的提问来源于stack exchange,提问作者yunum
相关产品推荐
相关产品推荐

