OO设计继承

时间:2012-10-04 08:26:19

标签: oop inheritance

我有这两个代表一些股票数据的类。他们没有任何行为。这些类有一些常见的数据,如ExchangeSymbol,MySymbol和Time。你认为将这些抽象给基类是一个好主意吗?请分享您的想法。

class SymbolData
{
    public string ExchangeSymbol { get; set; }
    public string MySymbol { get; set; }
    public double Price { get; set; }
    public int Volume { get; set; }
    public string Time { get; set; }
}

class EquityQuoteData 
{
    public string ExchangeSymbol { get; set; }
    public string MySymbol { get; set; }
    public double AskPrice { get; set; }
    public double BidPrice { get; set; }
    public int AskVolumne { get; set; }
    public int BidVolumne { get; set; }
    public string Time { get; set; }
}

3 个答案:

答案 0 :(得分:0)

我不会毫无理由地创建第三个(基础)类。

您可以EquityQuoteData继承SymbolData,因为它们共享大多数属性,但前者有AskPriceBidPrice代替Price,这是interface IData { string ExchangeSymbol { get; set; } string MySymbol { get; set; } string Time { get; set; } } 没用在儿童班。

考虑实施一个通用界面:

class SymbolData : IData
{
    public double Price { get; set; }
    public int Volume { get; set; }

    public string IData.ExchangeSymbol
    {
        get; set;
    }

    public string IData.MySymbol
    {
        get; set;
    }

    public string IData.Time
    {
        get; set;
    }
}

class EquityQuoteData : IData
{
    public double AskPrice { get; set; }
    public double BidPrice { get; set; }
    public int AskVolumne { get; set; }
    public int BidVolumne { get; set; }

    public string IData.ExchangeSymbol
    {
        get; set;
    }

    public string IData.MySymbol
    {
        get; set;            
    }

    public string IData.Time
    {
        get; set;
    }
}

然后:

public double AskPrice { get; set; }
public double BidPrice { get; set; }
public int AskVolumne { get; set; }
public int BidVolumne { get; set; }

无论如何,如果你必须这样做:

price

这也是代码气味,所有这些前缀。

我会考虑将volumneEquityQuoteData(?)放在一个类中,无论名称是什么,然后为Ask类提供两个属性 - BidSymbolData - 两者都属于同一类型。 {{1}}只会有一个。

答案 1 :(得分:0)

如果ExchangeSymbol,MySymbol和Time有些相关,请将它们分组到一个可重用的类中,并使其成为SymbolData和EquityQuoteData的成员(支持组合而不是继承)。 如果不是:不要!

请记住:继承/多态主要是关于行为而不是关于数据。值对象中的继承可能会导致不必要的副作用 - 例如等于在这里玩得不好。

答案 2 :(得分:0)

查看继承的一种方法是考虑has-ais-a关系。

如果您有一些基类(数据对两个名称都是通用的)Data那么您必须确保发送“EquityQuoteData是(类型)Data”并且“SymbolData是(类型)Data”。

考虑它的另一个方便的方法是问:你可以用任何派生类型替换所有Data的实例,并且仍然有意义吗?

例如:

我今天要处理很多Data个项目。

我今天要处理很多EquityQuoteData个项目。

在你的情况下,我需要更多地了解每个类的角色,但我想说可能是的,你应该抽象出相关类的共同特征。

在一个不相关的注释中,这基本上是一个结构而不是一个类。我会研究封装和其他OO设计原则(Google SOLID)