Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在基类中隐藏变量,但在继承类中显示它们_C#_Unity3d - Fatal编程技术网

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

C# 如何在基类中隐藏变量,但在继承类中显示它们,c#,unity3d,C#,Unity3d,我在编码上有点卡住了。 所以我正在制作一个progressbar,但我正在用C#进行面向对象编程的实验。 我有两个班,一个是CProgressBar班,另一个是ProgressBar班。 ProgressBar继承自CProgressBar并获取其变量,但我想将CProgressBar中的两个变量设置为公共变量,但仍将它们保留为ProgressBar中的私有变量。 我还应该提到,这是针对Unity3D的,因此是RawImg类 更新: 因此,在一些人评论了一些方法之后,我觉得答案并不能解决我的特定

我在编码上有点卡住了。
所以我正在制作一个progressbar,但我正在用C#进行面向对象编程的实验。 我有两个班,一个是CProgressBar班,另一个是ProgressBar班。

ProgressBar继承自CProgressBar并获取其变量,但我想将CProgressBar中的两个变量设置为公共变量,但仍将它们保留为ProgressBar中的私有变量。
我还应该提到,这是针对Unity3D的,因此是RawImg类

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

  • 我希望CProgressBar和ProgressBar在Unity编辑器中可见。其中一个答案显示CProgressBar类是抽象的,但这将在Unity编辑器中隐藏该类,因此这是错误的
  • mat和rawImg都应隐藏在CProgressBar上,但在ProgressBar上显示
  • 这些变量不一定需要较少的访问,它们只需要隐藏在基类上
  • 使用[HideInInsectt]属性将是一种攻击,但不确定在何处使用它

    // 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;
    
    如果我在基类变量上放置[HideInInsectt]属性,它也会在继承的类上隐藏它们。我不想那样


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

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

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

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


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

“我想将CProgressBar中的两个变量设置为公共变量,但仍将它们设置为CProgressBar中的私有变量。”如中所述,当
重写属性时,您无法更改辅助功能修饰符。再次查看,您试图
重写成员变量,这在C#中是不允许的,似乎是一个错误,他应该将属性声明为
受保护的
,并重写这些属性,而不是
私有
支持字段。他有领先的优势。
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;
}