当前位置: 首页 > 知识库问答 >
问题:

强制继承链的每个类覆盖抽象方法

司寇阳曦
2023-03-14

假设我有一个继承链,其中每个类都通过添加一个新字段来扩展其超类,我希望该链的每个类都覆盖toString()方法,如下所示:

public String toString()
{
    return super.toString() + "[newfield=" + newfield + "]";
}

如果我使用抽象基类,那么当继承链的一个类通过实现抽象方法变得具体时,从那时起的所有子类也通过继承已经实现的方法变得具体。

Java中有没有一种方法可以强制每个类重写(重新实现)抽象方法,即使它已经在继承链中实现得更高?

共有2个答案

庄浩言
2023-03-14

不,但是你可以让你的类实现一个接口,而不是抽象的超类。您可以在编译时检查类是否实现了接口,这取决于您对这些类所做的操作。

狄宜然
2023-03-14

简短的回答是:没有。

详细回答:您可以编写一个单元测试,扫描类路径(使用类似于反射的库),加载抽象类的每个子类,并检查使用反射的方法。但是在编译时没有办法做到这一点。

除了Java之外,AsheJ还有一个hasMethod()切入点,它可以为您进行检查,但不幸的是,它只对声明父母建议有效。也许您可以使用aspectj分两步完成:

>

  • 定义一个接口IllBehave
  • 定义一个建议,将此接口分配给从您的基类扩展但没有成员的类
  • 然后为实现此接口的所有类型声明一个编译错误

    pointcut isSubTypeOfYourClass(): within(com.your.BaseClass+);
    pointcut overridesMethod(): hasmethod(public void yourMethodName(..));
    declare parents: isSubTypeOfYourClass() && !overridesMethod()
                     implements com.yourcompany.IllBehaved;
    declare error: isSubTypeOfYourClass() && within(com.yourcompany.IllBehaved+):
                     "Implementation class must override <Foo> method";
    

    我还没有测试过这个,但是如果您打开-Xhas会员选项,它应该可以工作。当您使用Maven、Ant、Eclipse等标准工具时,将aspectj集成到您的构建中非常容易。

  •  类似资料:
    • 我有三个类,一个测试类、一个形状类和一个几何对象类。shape类扩展了geometricObject类(Geometric Object类是抽象的)。问题是,shape类和geometricObject具有相同的toString方法,但两者的内容不同。当我在测试类中调用toString方法时,我从shape类中的toString方法获得结果。当我尝试将我创建的对象转换到geometricObjec

    • 继承一个可以实现的普通超类有什么不同吗? atm我有一个名为的抽象类,我有/扩展这个。 abstractcar中的一个字段设置为"私有int容量" 但是在子类“小型汽车”中,当我输入“容量”作为构造函数中使用的变量时,它说“容量在抽象汽车中有私有访问” 我想: > 子类继承超类的所有字段和方法? 我现在该怎么进行?

    • 我有一个抽象类,这个类是在她的子类中扩展的: < li >我在这个抽象类上实现了一个方法,并抽象了另一个方法 < li >实现的方法是每个子类对象都必须访问的通用方法。所以我决定在抽象类上实现它,避免在每个子类上实现相同的方法。 小例子: 我想听听你对这种实施方式的看法, 问候。

    • 问题内容: 因此,我一直在为编程类编写抽象作业,但遇到了问题。我现在的目标是能够使用抽象,然后能够使用矩形和椭圆形绘制一个简单的城市,例如矩形建筑物或灯柱上的椭圆形灯。 我在编译时收到的错误是:MyTestApp.Rectangle不是抽象的,并且不会覆盖MyTestApp.Shape中的抽象方法drawEllipse(java.awt.Graphics)。该错误显示在类Shape下方的“矩形扩展

    • 我有一个关于JPA中继承的问题,是否可以使用JOINED策略来实现这个层次结构? 这是我的代码: 在上面的层次结构之后,我尝试使用JPQL进行查询,这是查询: 此代码从主代码运行 当我运行该查询时,会抛出以下错误 导致原因:com . MySQL . JDBC . exceptions . JDBC 4 . MySQL syntaxerrorexception:未知列“employee1_。“字段

    • 想象一下,我有一个抽象类动物的方法: 然后我有一个类,用以下内容扩展这个抽象类: 我希望每个扩展Animal的类都有一个fetch()方法。然而,fetch方法为相关动物指定了一些独特的特征(狗的爪子、猫的爪子等)。例如,cat的fetch()将获取参数fetch(fellinecat kitty)并表示: 因此,抓取方法接受了扩展抽象类“动物”(因此是动物)的参数。我在“动物”中定义了抓取()方