多态难题

时间:2019-02-28 10:40:02

标签: c# polymorphism

现在,我很欣赏这实际上是一个基于意见的问题,因此我希望它已经结束,但希望不会出现一些答案。我要处理的主题对我来说是新的,但它也很庞大。我可以在这里呆上一年,但仍然只能使冰山一角,因此为什么我自己会有些卡住。

因此,我遇到了三个现实世界对象的情况,我们将它们称为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; }
}

这看起来是否正确一些?

2 个答案:

答案 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; }
}