防止暴露基类(抽象类)

时间:2018-10-16 19:14:45

标签: c# inheritance abstract

因此,我浏览了许多相关问题,但似乎所有问题都不适合。至少不是以我目前的理解。由于这是一个简单的问题,因此我将简化我的问题和代码。

我有五个班级:

internal class A
internal abstract class B : A
internal abstract class C : B
public class D : C
public class E {
    public void X(C c) { }
}

这里有一个明显的可访问性问题,在C方法中使用了参数public。我需要访问类D而不暴露类C。我认为这可能是由于abstract关键字的性质以及我使用它的最低经验所致。

到目前为止,我还从未知道需要创建abstract类,这是我第一次在此级别上处理它。根据我的理解,在这种情况下,实际上我没有必要使用abstract类,只要我记得正确地实现了一切即可。


我的问题

  • 我是否应该创建一个具有F私有实例的类D作为包装,以防止暴露?
  • 使用abstract的确凿的理由是什么,因为我认为这段代码不是一个很好的例子。
  • 我可以在不暴露DAB的情况下暴露C的其他方式是什么?

注释

  • 我正在努力对当前的变化进行手术。
  • 最初所有班级都是私人的。

我看了很多相关的文章(这里有一些):

1 个答案:

答案 0 :(得分:2)

您可以使用界面隐藏细节。考虑一下:

//This represents the contract, regardless of the underlying object
public interface ISomeObject
{

}

//Class is internal, but implements the interface
internal class A : ISomeObject { }
internal abstract class B : A { }
internal abstract class C : B { }

//Class D is still internal
internal class D : C { }

public class E
{   
    //Method uses interface, which is public     
    public void X(ISomeObject c) { }

    public ISomeObject DoSomething()
    {
        //Create internal class, return it for use (as a contract)
        return new D();
    }
}

样品用量:

var e = new E();
var result = e.DoSomething();
e.X(result);

之所以可行,是因为从外部角度来看,您正在处理的是公共合同,而不是实际的实施。