c#不一致的可访问性阻止私有类作为受保护方法的参数

时间:2016-06-02 01:12:02

标签: c# namespaces

以下是我希望代码如何工作的简化示例。请注意,此代码无法编译:

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#惯例的不足吗?我只是对此过于珍贵吗?

3 个答案:

答案 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
}