因此,我浏览了许多相关问题,但似乎所有问题都不适合。至少不是以我目前的理解。由于这是一个简单的问题,因此我将简化我的问题和代码。
我有五个班级:
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
的确凿的理由是什么,因为我认为这段代码不是一个很好的例子。D
,A
或B
的情况下暴露C
的其他方式是什么?我看了很多相关的文章(这里有一些):
答案 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);
之所以可行,是因为从外部角度来看,您正在处理的是公共合同,而不是实际的实施。