防止基数暴露类(摘要类)
Prevent Exposure of Base Classes (Abstract Classes)
所以我查看了许多相关问题,其中 none 似乎完全符合。至少在我目前的理解中不是。由于这是一个简单的问题,我将简要介绍我的问题和代码。
我有五个 classes:
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) { }
}
public
方法中使用的参数 C
存在明显的可访问性问题。我需要在不暴露 class C
的情况下访问 class D
。我认为这可能是由于 abstract
关键字的性质以及我使用它的经验不足所致。
迄今为止,我从未有过创建 abstract
class 的已知需求,这是我第一次在这个层面上处理它。根据我的理解,在这种情况下使用 abstract
classes 并不是真的有必要,只要我记得正确地实现所有内容即可。
我的问题
- 我是否应该创建一个 class
F
,它有一个 D
的私有实例作为一种包装器来防止暴露?
- 使用
abstract
的充分理由是什么,因为我认为这段代码不是一个很好的例子。
- 我可以通过哪些其他方式公开
D
而无需公开 A
、B
或 C
?
备注
- 我正在尝试对我当前的更改进行手术。
- 最初所有 classes 都是私有的。
我看了很多相关的帖子(这里有一些):
- Inconsistent accessibility with abstract classes
- Inconsistent accessibility
- Inconsistent accessibility
- Inconsistent accessibility problem [duplicate]
- Inconsistent accessibility, property type
您可以使用界面来隐藏细节。考虑一下:
//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);
之所以可行,是因为从外部角度来看,您处理的是 public 合同,而不是实际实施。
所以我查看了许多相关问题,其中 none 似乎完全符合。至少在我目前的理解中不是。由于这是一个简单的问题,我将简要介绍我的问题和代码。
我有五个 classes:
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) { }
}
public
方法中使用的参数 C
存在明显的可访问性问题。我需要在不暴露 class C
的情况下访问 class D
。我认为这可能是由于 abstract
关键字的性质以及我使用它的经验不足所致。
迄今为止,我从未有过创建 abstract
class 的已知需求,这是我第一次在这个层面上处理它。根据我的理解,在这种情况下使用 abstract
classes 并不是真的有必要,只要我记得正确地实现所有内容即可。
我的问题
- 我是否应该创建一个 class
F
,它有一个D
的私有实例作为一种包装器来防止暴露? - 使用
abstract
的充分理由是什么,因为我认为这段代码不是一个很好的例子。 - 我可以通过哪些其他方式公开
D
而无需公开A
、B
或C
?
备注
- 我正在尝试对我当前的更改进行手术。
- 最初所有 classes 都是私有的。
我看了很多相关的帖子(这里有一些):
- Inconsistent accessibility with abstract classes
- Inconsistent accessibility
- Inconsistent accessibility
- Inconsistent accessibility problem [duplicate]
- Inconsistent accessibility, property type
您可以使用界面来隐藏细节。考虑一下:
//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);
之所以可行,是因为从外部角度来看,您处理的是 public 合同,而不是实际实施。