防止暴露基类(抽象类)
所以我查看了许多相关的问题,但似乎没有一个问题适合。 至少不是我目前的理解。 由于这是一个简单的问题,我将简要介绍我的问题和代码。
我有五个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) { } }
这里有一个明显的可访问性问题,参数C
在public
方法中使用。 我需要在不暴露C
类的情况下访问D
类。 我相信这可能是由于abstract
关键字的性质以及我使用它的最小经验。
到目前为止,我从未有过创建abstract
类的必要性,这是我第一次在这个级别上处理它。 根据我的理解,在这种情况下,只要我记得正确地实现所有内容,就不必使用abstract
类。
我的问题
- 我应该创建一个具有
D
私有实例的类F
作为一种包装来防止暴露吗? - 使用
abstract
的可靠理由是什么,因为我不相信这段代码是一个很好的例子。 - 我可以在不暴露
A
,B
或C
情况下暴露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);
这是有效的,因为从外部角度来看,您正在处理公共合同,而不是实际的实施。