【问题标题】:How to hide variables in a base class but show them in an inherited class [duplicate]如何在基类中隐藏变量但在继承类中显示它们[重复]
【发布时间】:2018-09-02 23:09:48
【问题描述】:

我的编码有点卡住了。
所以我正在制作一个进度条,但我正在尝试用 C# 进行 OOP 编程。 我有两个类,一个 CProgressBar 和 ProgressBar 类。
ProgressBar 继承自 CProgressBar 并获取其变量,但我想将 CProgressBar 中的两个变量公开,但仍将它们保留在 ProgressBar 中。
我还应该提到这是针对 Unity3D 的,因此是 RawImg 类。

更新: 因此,在某些人评论了一些方法之后,我觉得答案并不能解决我的特定问题。我将重新措辞。

  • 我希望 CProgressBar 和 ProgressBar 在 Unity 编辑器中可见。其中一个答案显示 CProgressBar 类是抽象的,但这会在 Unity 编辑器中隐藏该类,因此不存在。
  • mat 和 rawImg 都应该在 CProgressBar 上隐藏,但在 ProgressBar 上显示。
  • 变量不一定需要较少的访问权限,它们只需要隐藏在基类中即可。
  • [HideInInspector] 属性的使用会是一种技巧,但不确定在哪里使用它。

    // public CProgressBar.cs
    public abstract RawImage rawImg
    {
        get;
    }
    public abstract Material mat
    {
        get;
    }
    
    // public ProgressBar.cs
    public override RawImage rawImg => null;
    public override Material mat => null;
    

    如果我将 [HideInInspector] 属性放在基类变量上,它也会将它们隐藏在继承类上。我不想那样。

我想现在我将不得不公开这两个变量,允许我的用户更改我不希望他们更改的内容。

【问题讨论】:

  • “我想公开 CProgressBar 中的两个变量,但在 CProgressBar 中仍然保持私有。”
  • documentation 中所述,当override 使用属性时,您无法更改可访问性修饰符
  • 第二次看你试图override成员variables,这在C#中是不允许的
  • 好像xy problem
  • 他应该将属性声明为protected 并覆盖这些属性而不是private 支持字段。他的前导下划线约定是倒着的。

标签: c# unity3d


【解决方案1】:

代码错误。这取决于你想做什么。

在您的代码中,您试图覆盖一个成员;这不可能。以及为什么有一个私有财产需要改变。

public abstract class CProgressBar : MonoBehaviour
{
    public virtual RawImage RawImg
    {
        get;
        protected set;
    }

    public virtual Material Mat
    {
        get;
        protected set;
    }
}

public class ProgressBar : CProgressBar
{
    public ProgressBar()
    {
        Mat = null;
        RawImg = null;
    }
}

public abstract class CProgressBar : MonoBehaviour
{
    protected abstract RawImage RawImg
    {
        get;
    }

    protected abstract Material Mat
    {
        get;
    }
}

public class ProgressBar : CProgressBar
{
    protected override RawImage RawImg => null;

    protected override Material Mat => null;
}

public abstract class CProgressBar : MonoBehaviour
{
    protected virtual RawImage _rawImg
    {
        get => rawImg;
        private set => rawImg = value;
    }

    protected virtual Material _mat
    {
        get => mat;
        private set => mat = value;
    }

    private RawImage rawImg;
    private Material mat;
}

public class ProgressBar : CProgressBar
{
    protected override RawImage _rawImg => null;

    protected override Material _mat => null;
}

我知道这是一个愚蠢的例子。当您需要一个属性时,这根本不是正确的使用方法。尝试更具体地定义您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-15
    • 2010-12-24
    • 1970-01-01
    • 2018-06-13
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多