2010-11-05 28 views
0

我目前正在为我的课程作业编写一个应用程序的类,并且我有两个类,听起来好像它们应该是基类派生的类对,并确实共享两个成员变量,并且我的问题是他们每个人有七个成员变量,没有任何操作。是否应该在基类和派生类之间共享特定比例的成员?

这些类的结构的原因是我正在构建一个RSS阅读器,我打算让这两个类在feed上保存数据。第一个将在Feed本身保存数据,例如源URL,本地存储中rss.xml文件的位置,上次更新Feed时的位置等。第二个将保存关于包含在诸如发布日期/时间的馈送和基于将用于按时间顺序排序文章的发布日期的整数索引。

class feed 
{ 
    string title; 
    string description; 
    string feed_url; 
    string local_location; 
    string channel; 
    bool feed_is_changed; // This is a flag that will be raised and lowered 
     // when the feeds are being refreshed 
    double last_updated; // The last update date/time will be converted to a 
     //standardised double value 
} 

class feed_item 
{ 
    string title; 
    string description; 
    double pub_time; 
    double pub_time_in_sec; // I'm separating the seconds so they can be used 
     // for a 'sub-index' when there are multiple feeds with the same pubtime 
     // (there are restrictions on the data types we are allowed to use 
     // (concocting work-arounds will aid in understanding, etc)) 
    double pub_date; 
    int pub_year; 
    int order_in_list; // The index that will be calculated from pub_time, 
     // pub_date, etc 
} 

上面的代码是不完整的,我目前只能识别变量和函数,以及私有/公共位会一旦他们完成。从上面的代码可以看出,共享的唯一两个变量是标题的说明。

我不确定是否值得让它们成为一个实体 - 基础对并且仅仅停用五个不相关的变量,如果将它们变成完全独立的类更有效率,或者这完全是一个情境问题,并且它可以用任何方式来论证。我担心的是代码可能难以维护和扩展,但是可能会在一种方法或另一种方法中存在固有的执行开销。任何想法和建议,将不胜感激。

+0

定义'价值'和'高效'。你在优化什么? – 2010-11-05 22:05:25

+0

我可以问一个有7个成员变量而没有操作的类的目的是什么? – 2010-11-05 22:06:35

+0

@Paul Hankin当我说'值得'和'高效'时,我正在谈论代码的可维护性和可伸缩性,以及执行效率。对不起,我应该在问题中指定。 – 2010-11-05 22:56:34

回答

2

feed_item不是饲料,因此它不符合Liskov substitution principle,也不应该是子类。我应该检查你的耳朵 - 这两个班绝对听起来不像他们应该是子类。

有时候(非常非常偶尔)实现继承是一个好主意,但通常通过将共享部分提取到单独的类中并在两个实现中使用它们可以更好地完成。在这里,这绝对是一个可怕的想法 - 没有很好的代码共享,所以好处是模糊的。保持你的代码简单!

1

只有一个派生类?那么几乎可以肯定的继承是错误的设计。

继承是限制性的,这些限制往往不会出现,直到后来做出更加昂贵的决定。

我的经验法则是为了避免继承,除非我可以做出明确而有力的案例来使用它。

1

如果你真的想要一个基类:

struct NamedItem { // or maybe just "Item" 
    string title; 
    string description; 
}; 

struct Feed : NamedItem {/*...*/}; 
struct FeedItem : NamedItem {/*...*/}; 

或者,通常是首选和更适合在这种情况下,用围堵:

struct ItemInfo { 
    string title; 
    string description; 
}; 

struct Feed { 
    ItemInfo info; 
    //... 
}; 
struct FeedItem { 
    ItemInfo info; 
    //... 
}; 

尤其是,如果你不知道如何你会在不知道最派生类型的情况下使用“NamedItem”,但使用继承是没有意义的。

相关问题