Java 基于访问器方法强制严格继承

Java 基于访问器方法强制严格继承,java,inheritance,interface,polymorphism,abstract-class,Java,Inheritance,Interface,Polymorphism,Abstract Class,假定基类定义为 abstract Base{ protected int field; protected int getter(){ return this.field; } ... } 为了对子类型进行分类,在这个getter的基础上,我创建了一个接口,比如 interface MyFieldGettable{ public int getter(); } 我很高兴创建一个子类型,比如 class CantGetField exte

假定基类定义为

abstract Base{
    protected int field;
    protected int getter(){
        return this.field;
    }
    ...
}
为了对子类型进行分类,在这个getter的基础上,我创建了一个接口,比如

interface MyFieldGettable{
    public int getter();
}
我很高兴创建一个子类型,比如

class CantGetField extends Base{
    ....
}
既然基础版本已经打印了字段,让我们将补码子类型设置为

class CanGetField extends Base implements MyFieldGettable {
    public int getter(){
        return this.getter();
    }
}
现在,在一段代码的某个地方有一个
列表
,我想将这两种类型分开,并检查
CanGetField
类型的字段。所以我写,

for(Base b:listOfBase){
    if(b instanceof CanGetField){
        int field = ((CanGetField)b).getter();
而且,如果你们中有人现在猜到的话。这会吹到
堆栈溢出错误
。现在,我可以通过更正class
CanGetField
as的定义来解决这个问题

class CanGetField extends Base implements MyFieldGettable {
    public int getter(){
        return this.field;
    }
}
或者,我可以在接口中更改getter方法的名称,并将子类型中的所有调用委托给base方法。但是,这将导致子类型中存在大量冗余代码

还有其他解决办法吗

这吹进了StackOverflowerr。现在,我可以通过 将CanGetField类的定义更正为

getter()
在此处执行无限递归调用:

class CanGetField extends Base implements MyFieldGettable {
    public int getter(){
        return this.getter();
    }
}
如果要重写
getter()
方法以仅更改修饰符而不更改其行为,可以调用
super.getter()


正如用户所建议的,在问题的评论中。这就是我要找的

class CanGetField extends Base implements MyFieldGettable {
    public int getter(){
        return super.getter();
    }
}

return super.getter()
,大概是吧?@OliverCharlesworth你比我领先49秒:(别这么傻。我在想这件事。然后使用
super.getter())
取而代之。他想用完全相同的实现覆盖它。这是无用的。确切地说,我找到了
StackOverflowerError
的原因。无论如何,感谢您的输入。该方法已实现,但它不是
public
。其动机是利用该方法作为与其他子类型的区别。@soufrk好的,我理解。所以
public int getter(){return super.getter();}
应该足够了
class CanGetField extends Base implements MyFieldGettable {
    public int getter(){
        return super.getter();
    }
}