【问题标题】:Abstract class member inaccessible due it's protection level抽象类成员由于其保护级别而无法访问
【发布时间】:2016-09-12 04:46:20
【问题描述】:

如何访问抽象类的受保护成员?假设我有如下定义的类

public abstract class BaseClass
{
    private int index ;

    protected int GetIndex
    {
        get { return index ;}
        set { index = value; }
    }
}

public class MyClass : BaseClass
{
     ...
}

public class TestClass
{
     var data = new MyClass()
     var index = data.GetIndex;
}

线

var index = data.GetIndex;

抱怨由于它的保护级别而无法访问。如何访问TestClass中MyClass的GetIndex属性?

-艾伦-

【问题讨论】:

  • 公开或内部或使用反射?
  • 这不是受保护标识符的重要用途。你可以把它公开或内部..
  • 为什么您希望受保护的成员可以在类/派生类的成员之外访问?非常不清楚您要达到的目标。
  • 注意:属性不应包含文本 GetSet。如果该属性代表一个索引,那么你应该这样命名int Index { get; set; }

标签: c# oop


【解决方案1】:

您的问题正是 protected 的用途。

保护字段/方法不被基类或子类的外部使用。 TestClass 不是从 BaseClass 或 MyClass 派生的;您是否无法访问 GetIndex。它是如此简单。

因此,您的选择空间是:

  1. 在 BaseClass 上替换 protected
  2. Provide other 意味着在 MyClass 中检索/设置该属性
  3. 将 TestClass 更改为从 BaseClass 派生

该列表中没有特定的顺序;但显然,选项 3 是这里“最差”的选择。

【讨论】:

  • 好吧,如果它是某个单元测试目录中的特定测试类......也许吧。
【解决方案2】:

使用这个:

public abstract class BaseClass
{
    public int GetIndex { get; private set; }

    public BaseClass() { GetIndex = 0; }
}

那么你可以只在 BaseClass 中设置 GetIndex (你的可验证 index 是私有的)或者:

public abstract class BaseClass
{
    private int index;

    public int GetIndex 
    { 
        get { return index; } 
        protected set { index = value; } 
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2011-09-01
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多