You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 21:45:27