是否可以在Java中链接重写的方法

时间:2013-05-31 05:58:47

标签: java oop inheritance override subclass

假设我有一个抽象类:

abstract class DBTable {

    abstract boolean append();

}

而且我还有一个继承自DBTable的子类:

// Client objects are rows of a database table
class Client extends DBTable {

    @Override
    boolean append() {

    }
}

最后,假设我有一个Client的子类,我用它来表示Client对象的非规范化形式(我觉得这没关系。它都在同一个包中,而且Client.Expand -is a-客户端)。

我想要做的是覆盖Client.Expand中的append()方法,并让它链接到Client中的append()方法,然后再回到仅适用于子类的工作。像这样......

    // Expand is a member class of Client
    static class Expand extends Client {

        @Override
        boolean append() {
            super.append();
            :
            :
        }
    }

Java是否允许这样做?当我尝试覆盖已在父类中重写的方法时,我从IDE收到错误。看起来我应该能够覆盖一个重写的方法来提供子类所需的额外实现,但是Java可能不是为这种继承而构建的吗?

2 个答案:

答案 0 :(得分:0)

您的示例有几个问题:

  1. 当您将类的成员声明为static时,此成员与Class关联。它不能与该类的实例一起使用。例如,当你在Expand的追加方法中有一个代码,例如 - super .append() - 那个“super”指的是一个实例,而不是“class”。因此它与静态定义相矛盾。正如评论中建议的那样,您需要从类声明中删除静态。

  2. 子类,不应该是内部类,这不是一个好的设计,即使是允许的。因为,如果从语义上考虑它,子类不是超类的成员(在这种情况下,父子词是误导的,超类和子类更好)。超类不应该知道可以扩展它的类,它应该是自包含的。因此,最好将子类移动到单独的类中。

  3. 您的设计还有其他一些问题:首先,命名不是对主题的描述。如果客户端表示一行,那么Row或TableRow,...可能是一个更好的名称,而ExpendedRow用于下一个类。

  4. 但是,更重要的是,扩展表格的行不是一个好主意。更好的方法可能是让Row类和Table类组成Row。像这样:

    // Client objects are rows of a database table
    class Row {
    
        @Override
        boolean append() {
    
        }
    }
    
    class Expanded extends Row{
    
            @Override
            boolean append() {
                super.append();
                :
                :
            }
        }
    class DBTable {
    
        Row row;
    
    }
    

答案 1 :(得分:0)

我发现了问题。这让人很难堪。作为我自己辩护的一部分,我会稍微回答一下我自己的问题。

我喜欢设计我的类,以便一个类提交一个主题。与该主题相关的所有功能,我都想尝试放入同一个类。这对数据库数据模型类尤其有用,因为类的结构通常可以为其他数据库模型类重复。

我的意思是什么?

嗯,这是我的Client类的“结构”。如您所见,它包含几个成员类:

+----------------------------+
|  CLIENT                    |
+---+------------------------+
    |  static EXPAND         |
    +------------------------+
    |  static GHOST          |
    +------------------------+
    |  static BUILDER        |
    +------------------------+
    |  static INQUISITOR     |
    +------------------------+
    |  static QUERYBUILDER   |
    +------------------------+
    |  static JDBCFactory    |
    +------------------------+

我非常喜欢这个设计。这意味着为我构建Client对象的类可以与Client类在同一个文件中,我可以使用半助记符“new Client.Builder()”调用它,或者我可以创建一个构建SQL查询的对象对于具有“new Client.QueryBuilder()”的Client对象。其对象成为从JDBC结果集创建Client对象的工厂的类可以使用“new Client.JDBCFactory”等实例化。我非常喜欢这个。

缺点是...我有很多支撑。

而且......如果我不小心,我可以输入最终错误的内容。在这种情况下,在我输入append()方法的定义时,我想要在EXPAND成员类中......实际上只是在大括号之外,我在CLIENT的上下文中键入它。

好吧,客户端已经有了一个append()方法,因此IDE向我抱怨说我试图在已经有append()方法的同一个类中覆盖一个方法。

是的,Java完全支持覆盖链接。我的IDE或JVM没有任何问题......只是和我在一起。再次感谢@Robe和其他人的意见。