以下是我希望代码如何工作的简化示例。请注意,此代码无法编译:
namespace SpecificNamespace
{
class UtilityObject
{
//properties
}
public abstract class Entity
{
protected void doStuff(UtilityObject utilityObject)
{
//does stuff
}
}
// include implementations of Entity
}
namespace GeneralNamespace
{
public static class World
{
public static List<SpecificNamespace.Entity> Entities = new List<SpecificNamespace.Entity>();
}
}
由于以下行而无法编译:
protected void doStuff(UtilityObject utilityObject)
可访问性不一致:参数类型“UtilityObject”比方法“Entity.doStuff(UtilityObject utilityObject)”
更难访问
但我发誓,我只是为Entity
内部声明的类实现SpecificNamespace
,因此任何引用受保护方法Entity.Dostuff
的类也可以访问到UtillityObject
。由于此命名空间之外的任何类都没有任何业务知道UtilityObject
是什么,我不想将其声明为公共。另一方面,Entity
需要公开,以便可以一般性地引用实体。
有解决方法吗?这是C#惯例的不足吗?我只是对此过于珍贵吗?
答案 0 :(得分:1)
尝试使UtilityObject成为Entity中具有受保护的可访问级别的内部类。
答案 1 :(得分:1)
如果将UtilityObject移动到基类Entity:
中cv2.VideoCapture
这是更接近的一步;但是,UtilityObject必须至少受到保护范围或更好,因为这样考虑:如果定义public abstract class Entity
{
class UtilityObject
{
//properties
}
,类public class A : Entity
需要能够看到UtilityObject,它不能如果它是私人的(甚至在课堂上是私人的)。您可能能够将A
与嵌套类一起使用但不确定;如果可以,那就更接近......
但这就是为什么你得到那个错误的本质;由于范围的原因,所有未来的实现都需要能够添加它。
答案 2 :(得分:0)
您可以创建一个公共接口IUtilityObject
,然后您可以将您的UtilityObject类保持在内部,就像您拥有它一样:
namespace SpecificNamespace
{
public interface IUtilityObject
{
int Id { get; set; }
}
class UtilityObject : IUtilityObject
{
//properties
public int Id { get; set; }
}
public abstract class Entity
{
protected void doStuff(IUtilityObject utilityObject)
{
//does stuff
}
}
// include implementations of Entity
}