现在,我很欣赏这实际上是一个基于意见的问题,因此我希望它已经结束,但希望不会出现一些答案。我要处理的主题对我来说是新的,但它也很庞大。我可以在这里呆上一年,但仍然只能使冰山一角,因此为什么我自己会有些卡住。
因此,我遇到了三个现实世界对象的情况,我们将它们称为HelloWorld,Foo和Bar。 Bar具有与Foo EXCEPT相同的所有属性。此特定属性对酒吧无效。取而代之的是,Bar具有该类型唯一的附加属性。因此,在我看来,Bar继承Foo是有意义的。现在,HelloWorld可以根据情况设置Foo或Bar,并且操作将根据其所持有的对象而有所不同。
我想知道的是-下面的示例是否可以存放水,或者是否有代码气味,就像阳光下还剩下一周大的黑线鳕?!如果闻到了气味,走的“正确”方法是什么?这是所有新代码-我没有重构,因此我有能力在第一时间做到正确。
public class Foo
{
// This property is valid for Foo AND Bar
public int Property1 { get; set;}
// This property is valid for Foo ONLY.
public virtual string Property2 { get; set;}
}
public class Bar
{
// This cannot exist in Bar - so always return null, don't allow it to be set.
public new string Property2 => null;
// Unique to Bar.
public List<int> Property3 { get; set;}
}
public class HelloWorld
{
public Foo FooProperty { get; private set;}
private HelloWorld()
{
}
// Create a new object with the property as a Foo.
public static HelloWorldWithFoo()
{
return new HelloWorld()
{
FooProperty = new Foo()
};
}
// Create a new object with the property as a Bar.
public static HelloWorldWithBar()
{
return new HelloWorld()
{
FooProperty = new Bar()
};
}
}
编辑
好的-所以我的“通用”示例可能缺少所需的上下文-道歉。接受了评论等之后,我就这样应用了它-并且为了清楚起见使用了真实世界的类型。
public class Slot
{
public CardBase CardDetails { get; set; }
private Slot()
{
}
public static Slot CreateSlotWithCard()
{
return new Slot()
{
CardDetails = new Card()
};
}
public static Slot CreateSlotWithCarrierCard()
{
return new Slot()
{
CardDetails = new CarrierCard()
};
}
}
public class CardBase
{
public string Name { get; set; }
public DateTime InstallationDate { get; set; }
public HardwareType Type { get; set; }
}
public class Card : CardBase
{
public List<int> Ports { get; set; }
}
public class CarrierCard : CardBase
{
public List<Card> SubCards { get; set; }
}
这看起来是否正确一些?
答案 0 :(得分:1)
正如您所指出的,这是一个基于观点的问题,因此我可以就大多数人都同意的主题发表自己的观点。
选择哪种类型继承其他类型应该来自概念模型,而不是其实现。因此,您不应该问 Foo是否具有这样的属性,而Bar是否具有继承该属性的属性?,但是您应该问 Foo本质上是Bar的一种,还是相反? / em>。如果两者都不是,请考虑为这两种类型编写抽象基类或界面。
答案 1 :(得分:1)
所以,在我看来,Bar继承Foo是有意义的...
我认为情况并非如此。我认为您希望他们俩都从另一个普通类继承来保存他们 share 的内容。 并让他们保留使他们与自己“不同”的东西。
public class Common
{
// This property is valid for Foo AND Bar
public int Property1 { get; set; }
}
public class Foo : Common
{
// This property is valid for Foo ONLY.
public string Property2 { get; set; }
}
public class Bar : Common
{
// This cannot and *hence will not* exist in Bar.
// public new string Property2;
// This property is valid for Bar ONLY.
public List<int> Property3 { get; set; }
}