【发布时间】:2019-07-15 00:07:12
【问题描述】:
我有 1 个接口 IMetadata,我想限制仅访问当前程序集(类库)而不是外部,因此我将其标记为内部。
现在我想将此接口注入到我的基抽象类中,并在我的基类方法上调用 IMetadata 的方法来执行一些逻辑。例如,基类将从派生类 Type1 接收版本控制,因此我已将基抽象类构造函数标记为受保护,但出现以下错误:
可访问性不一致:参数类型 IMetadata 较少 比 BaseType.BaseType(IMetadata) 更容易访问
但是此元数据将始终从派生类(Type1)接收其具体类型,因此我希望此基类构造函数受保护,并且我希望元数据仅在当前程序集中可用,而不是在它之外。
internal interface IMetadata
{
string CreateMetadata();
}
internal class Metadata : IMetadata
{
public Metadata(string location)
{
this.location = location;
}
public string CreateMetadata()
{
}
}
public interface IBaseType
{
Void Perform();
}
public abstract class BaseType : IBaseType
{
private readonly IMetadata _metadata;
protected BaseType(IMetadata metadata) //error
{
}
}
class Type1 : BaseType
{
public Type1(IMetadata metadata) :
base(metadata)
{
}
}
谁能告诉我问题出在哪里以及如何实现这种封装?
【问题讨论】:
-
public事物不能有不是public的依赖项(例如构造函数参数)。IMetadata必须是public。该错误基本上向您解释了这一点。 -
@mjwills 但是问题将是 IMetadata 将在我试图避免的程序集之外被访问。有没有办法实现这两者(防止外部访问 Imetadata 并且还具有受保护的构造函数基础抽象类)?
-
不,没有。
public/protected事物不能依赖于internal事物。我的意思是,这样做有什么意义?您也可以将其设为internal,因为无论如何它在程序集之外都不会有用。 -
@mjwills 你认为这是造成这个问题的设计缺陷吗?
-
不,对消费者隐藏实现细节是件好事。
标签: c#