使用用作受保护字段的内部类型

zaq*_*zaq 7 .net c#

我有一个包含2个公共类的类库,它们继承自抽象类.在抽象类上,我有一个受保护的字段,只能由继承的类访问.用于该字段的类型是内部类的类型.

例如,我有:

internal class MyInternalClass
{
    ...
}

public abstract class MyAbstractClass
{
    protected MyInternalClass myField;
}
Run Code Online (Sandbox Code Playgroud)

现在我明白这不会起作用,因为如果派生自MyAbstract类的其中一个类扩展到程序集之外,那么访问myField将是非法的.

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

Aus*_*nen 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您还可以将内部类引用存储在私有字段中,然后提供受保护的属性,将其公开为公共接口.这样做的另一个好处是允许您进一步限制对内部类(通过接口)的访问,使其仅限于MyAbstractClass派生所需的内容.如果此接口以不同方式实现(例如,通过将其功能分解为两个辅助类而不是一个辅助类),它还为您提供了灵活性.) (2认同)