抽象类多重继承

时间:2016-07-06 11:16:31

标签: java oop inheritance

我有以下类的结构:

  • 抽象类A
  • B类扩展了A类
  • 抽象类C扩展了B类
  • D类扩展了C类

我有一个静态方法,返回类型 A 并返回 B - 这没关系。 我想更改此方法,因此它仍然有返回类型 A ,但它返回 D - 这会导致问题:

java.lang.Error: Unresolved compilation problem: 
    D cannot be resolved to a type

为什么会这样?他们应该拥有与父类不同的界面? 修改

这是我试图修改的方法

public static CodeFormatter createDefaultCodeFormatter(Map<String, ?> options) {
        if (options == null)
            options = CCorePlugin.getOptions();
        return new CCodeFormatter(options);
    }

这是CDT项目的一个班级(http://git.eclipse.org/c/cdt/org.eclipse.cdt.git/commit/?id=a83be9db5b41c0a593425798a2af91060588b38a)。我试图返回MyFormatter而不是CCodeFormatter。类CCodeFormatter(我们的B在示例中)扩展了CodeFormatter(我们的A在示例中)并且由抽象类MyFormatter(或C in example )扩展此类由MyFormatter类扩展( D in example )。所以我将它的项目添加到必需的包(在MANIFEST.MF中),然后我导入它并返回新的MyFormatter(选项)。最后,会发生此错误。

public static CodeFormatter createDefaultCodeFormatter(Map<String, ?> options) {
        if (options == null)
            options = CCorePlugin.getOptions();
        return new MyFormatter(options);
    }
&#34; D&#34;类

public class MyFormatter extends MyAbstractFormatter{

    @Override
    protected CodeFormatterVisitor getFormatterVisitor(DefaultCodeFormatterOptions preferences, int offset, int length) {
        return new MyFormatterVisitor(preferences, offset, length);
    }

}

和&#34; C&#34;类

public abstract class MyAbstractFormatter extends CCodeFormatter {

    public MyAbstractFormatter() {
        super();
    }

    public MyAbstractFormatter(DefaultCodeFormatterOptions preferences) {
        super(preferences);
    }

    public MyAbstractFormatter(DefaultCodeFormatterOptions defaultCodeFormatterOptions, Map<String, ?> options) {
        super(defaultCodeFormatterOptions, options);
    }

    public MyAbstractFormatter(Map<String, ?> options) {
        super(options);
    }

    @Override
    public void setOptions(Map<String, ?> options) {
        super.setOptions(options);
    }

    @Override
    public TextEdit format(int kind, String source, int offset, int length, int indentationLevel, String lineSeparator) {
        return super.format(kind, source, offset, length, indentationLevel, lineSeparator);
    }

}

1 个答案:

答案 0 :(得分:0)

好的,问题似乎是循环依赖(而不是抽象类)。我的项目依赖于CDT项目,我正在尝试将我的项目添加到这个项目所需的包中,我正在使这个CDT项目依赖于我的项目。 (Altought Eclipse通常会检测到这个问题,但情况可能并非如此)。