7

我有一个类库,其中包含 2 个从抽象类继承的公共类。在抽象类上,我有一个受保护的字段,只能被继承的类访问。用于该字段的类型是内部类的类型。

例如我有:

internal class MyInternalClass
{
    ...
}

public abstract class MyAbstractClass
{
    protected MyInternalClass myField;
}

现在我明白这是行不通的,因为如果从 MyAbstract 类派生的类之一在程序集之外扩展,则访问 myField 将是非法的。

我的问题是如何在保持 MyInternalClass 内部(不应在程序集外部访问它)并允许程序集中的类扩展 MyAbstractClass 并访问 myField 的同时使事情正常工作?

4

4 回答 4

5

创建一个MyAbstractClass需要和MyInternalClass实现的公共接口。

像这样的东西,所以你可以MyInternalClass默认使用它,但如果你需要注入新的行为(例如,模拟):

internal class MyInternalClass : IMyInterface
{
}

public interface IMyInterface
{            
}

public abstract class MyAbstractClass
{
    protected IMyInterface myField;

    protected MyAbstractClass(IMyInterface required = null)
    {
        myField = required ?? new MyInternalClass();
    }
}
于 2012-09-19T20:31:12.680 回答
0

你不能。如果MyAbstractClass是从外部类派生的,则MyInternalClass需要知道。

如果你需要考虑这样的事情,设计可能需要返工。

于 2012-09-19T20:31:22.063 回答
0

您需要一个关键字来指定受保护的“和”内部而不是受保护的“或”内部。不存在这样的关键字(从 C# 5.0 开始)。他们可以在以后的版本中添加它。

这里有很多关于这个的线程。例如问题 5596338

补充:现在我想出了这个“解决方案”:

public abstract class MyAbstractClass
{
    protected class AccessMyFieldHelper
    {
        internal MyInternalClass this[MyAbstractClass mac]
        {
            get { return mac.myField; }
            set { mac.myField = value; }
        }
    }
    protected static readonly AccessMyFieldHelper AccessMyField = new AccessMyFieldHelper();

    private MyInternalClass myField;
}

现在myFieldprivate,但通过AccessMyField. 由于它是一个索引器,因此您必须使用方括号[]

你怎么看?这可以做得更漂亮吗?

于 2012-09-19T20:40:22.920 回答
-1

使字段myField internal protected

您还必须将MyAbstractClass 设为内部。如果它继承自内部类,它就不可能是公共的。如果该类必须是公共的,那么就必须有一种解决方法:例如,创建一个接口来公开继承类所需的MyInternalClass的功能。

于 2012-09-19T20:33:50.097 回答