我有一个包含2个公共类的类库,它们继承自抽象类。在抽象类上,我有一个受保护的字段,只能由继承的类访问。用于该字段的类型是内部类的类型。
例如我有:
internal class MyInternalClass
{
...
}
public abstract class MyAbstractClass
{
protected MyInternalClass myField;
}
现在我明白这不会起作用,因为如果派生自MyAbstract类的其中一个类扩展到程序集之外,那么访问myField将是非法的。
我的问题是如何让MyInternalClass保持内部工作(它不应该在程序集外部访问)并允许程序集中的类扩展MyAbstractClass以访问myField?
答案 0 :(得分: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();
}
}
答案 1 :(得分:0)
你做不到。如果MyAbstractClass
来自外部类MyInternalClass
,则需要知道。
如果您需要考虑这样的事情,设计可能需要返工。
答案 2 :(得分:0)
制作字段 myField internal protected
。
您还必须将 MyAbstractClass 设为内部。如果它继承自内部类,则它无法公开。如果类必须是公共的,那么必须有一种方法来解决它:例如,创建一个接口,公开继承类所需的 MyInternalClass 的功能。
答案 3 :(得分:0)
您需要一个指定 protected“和”internal 而不是 protected“或”internal 的关键字。这样的关键字不存在(从C#5.0开始)。他们可以在以后的版本中添加它。
这里有很多线程。例如,question 5596338。
ADDITION:现在我想出了这个“解决方案”:
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;
}
myField
现在是private
,但通过AccessMyField
可以对其进行受保护的访问。由于它是一个索引器,您必须使用方括号[]
。