1

如果我从基类继承,是否有一条规则规定“仅在需要实现/使用所有(或 X%)基类功能/方法的地方继承”?我知道如果我继承了,那么我就继承了很多,但这并不意味着我必须全部使用它。

假设以下模式:

public abstract class Template
{   
    public void LoadCustomer()
    {
        //Load customer logic
    }
    public virtual void LoadGrid()
    {
        //Logic   
    }
    public virtual void other()
   { //logic }

    public virtual void other2()
   { //logic }

    public virtual void other3()
   { //logic }

    public string WelcomeMessage()
    {
         //perform lots of complex logic
         return "Hello and welcome";
    }
}

如果我的应用程序的一部分只想显示 WelcomeMessage(),那么从上面的 Template 类继承会不会是错误的(我知道我只能继承一次,但这不是这个问题的因素)(另请注意,我已经故意不包括任何抽象方法/字段)。

4

4 回答 4

3

在我“看到曙光”之前,我在很多项目上都走上了这条路。

是否有一条规则规定“仅在需要实现/使用所有(或 X%)基类功能/方法的地方继承”?

是和不是。不,没有规则,但是有一种方法可以做你想做的事。这称为优先组合而不是继承,这意味着您需要将每个功能块分解为单个类,然后(在当前的子类中)创建该类的实例,然后委派所需的工作给它。使用这种技术,您可以轻松地修改当前的超类,而不会对当前的子类产生连锁反应。

最重要的是,当有疑问(或者只是觉得好笑)时,不要使用继承。这体现在Liskov 替换原则中,该原则指出任何子类都应该是其超类的完整且适当的替代品。(即没有Boat子类Plane只是因为它们都可以载人)。

如需更多有趣的阅读,请查看SOLID软件工程范例。

于 2012-10-04T09:21:53.353 回答
2

抽象类的问题在于其中包含哪些方法和属性。如果每个后代都覆盖其中的每个方法,那么这是一个很好的设计。尽管您可以轻松地使用界面。当您不仅要定义合同(方法签名),还要实现一些默认行为时,抽象类是一个更好的选择。

想想 ToString(),如果你不覆盖它,它会返回类名。

如果您发现自己向抽象类添加方法只是为了在一小部分后代中覆盖它们,那么这是错误的选择。

这又回到了我的实例是东西或有东西。

我的经验表明,抽象基类只有在它定义的合同由要求固定时才应该使用。如果它的作用与它的作用方式相比有很大的改变潜力,请不要靠近它。

于 2012-10-04T09:26:42.667 回答
1

这里的问题不是继承本身,而是您的模板类看起来像一个糟糕 的上帝对象。

这就是从那个类继承感觉不对的原因。

于 2012-10-04T09:12:25.740 回答
1

实际上,何时使用和不使用继承有一些好处。你应该先阅读这篇文章:

http://msdn.microsoft.com/en-us/library/27db6csx(v=vs.80).aspx

于 2012-10-04T09:17:12.510 回答