如何隐藏基类中的变量,但在继承的类中显示它们

时间:2018-03-24 10:48:13

标签: c# unity3d

我的编码有点困难 所以我正在制作进度条,但我在C#中尝试使用OOP编程。 我有两个类,一个CProgressBar和ProgressBar类 ProgressBar继承自CProgressBar并获取其变量但我希望将CProgressBar中的两个变量设为public,但仍然将它们保存在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]属性,它也会在继承的类上隐藏它们。我不想要那个。

我想现在我必须公开两个变量,让我的用户改变那些我不想改变的事情。

1 个答案:

答案 0 :(得分:0)

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

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

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;
}

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

相关问题