我很好奇在涉及.NET中嵌套类型的某些场景时,什么是好的做法。
假设您有一个Wheel类,Wheel类包含Bearing对象。 Bearing对象仅在Wheel中有意义,并且您不希望允许它独立创建,因此将Bearing类嵌套在Wheel对象中是有意义的。但是,假设您有一个场景,您现在需要读取Wheel类之外的Wheel.Bearings属性。现在需要将嵌套的Bearing类设为public。
在这种情况下,最佳选择是什么?
1 - 创建嵌套在Wheel类中的公共Bearing类
2 - 创建一个独立的Bearing类,在其构造函数中获取Wheel对象
3 - 创建Wheel命名空间并在此命名空间内创建一个独立的Bearing类
4 - 别的什么?
更新: 我正在用更多细节更新这个,并反映到目前为止的一些建议。 ClassParent是父类,ClassChild是子类。 ClassChild总是ClassParent的一个孩子,单独存在是没有意义的。问题是ClassChild有一些需要公开暴露的属性,而所有其他属性只能从ClassParent调用。一个例子是ClassChild.Delete函数,它不应该公开公开,因为它只能从ClassParent调用,因为ClassParent需要执行适当的清理和修改。
在审核了这些建议后,我提出的设计对我来说看起来有些不洁,所以我想我会要求输入。我有:
public class Parent
{
ChildNested childObj
public DeleteChild()
{
//expose this method publically
childObj.DeleteChild()
//other functionality
}
public Child GetChild()
{
//expose Child, not ChildNested publically
return childObj
}
private class ChildNested:Child
{
public Child()
{
Base.Child()
}
public DeleteChild()
{
Base.Delete()
}
}
public abstract class Child
{
protected Child()
{
}
protected Delete()
{
}
public PublicPropertyToExpose()
{
}
}
答案 0 :(得分:8)
这里最好的设计是使用Bearing
构造函数创建一个公共internal
类,并在Wheel
类中创建它的实例。
如果Bearing
类需要访问Wheel
类的私有成员,则可以创建公共Bearing
类abstract
,然后将其作为一个具体的实现{ {1}} private
内的嵌套类。
答案 1 :(得分:1)
答案 2 :(得分:1)
我想独立测试“轴承”,所以我会选择第二个选项。
答案 3 :(得分:1)
轴承可以单独存在,因为它可能足以在世界其他地方使用,在车轮外。
使用轴承聚合车轮,但车轮未定义轴承。轴承非常有用,除轮子外还可以用于其他东西。
您需要一个公共属性作为一个轴承的事实表明它需要是一个公共类,在Wheel之外。
此外,当您重新发明轮子时会发生什么(我们都做...)。也许您使用新的“空气轴承”,例如存在于微型涡轮机中,现在您在Wheel类中有多个轴承类型,其中一些不使用。
我将Bearing放在同一个命名空间中,但不在Wheel类中。我很少发现需要内部课程。通常,匿名类填补了我需要的任何空白。