防止暴露基类(抽象类)

所以我查看了许多相关的问题,但似乎没有一个问题适合。 至少不是我目前的理解。 由于这是一个简单的问题,我将简要介绍我的问题和代码。

我有五个class:

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) { } } 

这里有一个明显的可访问性问题,参数Cpublic方法中使用。 我需要在不暴露C类的情况下访问D类。 我相信这可能是由于abstract关键字的性质以及我使用它的最小经验。

到目前为止,我从未有过创建abstract类的必要性,这是我第一次在这个级别上处理它。 根据我的理解,在这种情况下,只要我记得正确地实现所有内容,就不必使用abstract类。


我的问题

  • 我应该创建一个具有D私有实例的类F作为一种包装来防止暴露吗?
  • 使用abstract的可靠理由是什么,因为我不相信这段代码是一个很好的例子。
  • 我可以在不暴露ABC情况下暴露D其他方法是什么?

笔记

  • 我正试图通过我目前的变化进行外科手术。
  • 最初所有的课程都是私人的。

我看了很多相关的post(这里有几个):

  • 与抽象类不可访问的可访问性
  • 可访问性不一致
  • 可访问性不一致
  • 可访问性问题不一致[重复]
  • 可访问性不一致,属性类型

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

 //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(); eX(result); 

这是有效的,因为从外部角度来看,您正在处理公共合同,而不是实际的实施。