Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现某些子类而不是其他子类的目的?_Java_Inheritance_Superclass - Fatal编程技术网

Java 实现某些子类而不是其他子类的目的?

Java 实现某些子类而不是其他子类的目的?,java,inheritance,superclass,Java,Inheritance,Superclass,因此,我试图理解一个Java项目,其中有一个接口,然后是一个包含子类B、C和D的类a,每个子类都有各自数量的子类 我注意到一些子类扩展了它们给定的超类并实现了接口,而另一些子类只是扩展了它们的超类。此外,例如类B的一些子类将声明一个方法,该方法也在类B和类a中声明,并在接口中使用 我的问题是-如果扩展二级子类允许它们继承其超类的属性并因此实现接口,那么在二级子类中实现接口的目的是什么 我知道我的逻辑一定有缺陷,一定有原因,因为一些次要子类实现了接口,而其他子类没有 下面是一个实现Idump的示例

因此,我试图理解一个Java项目,其中有一个接口,然后是一个包含子类B、C和D的类a,每个子类都有各自数量的子类

我注意到一些子类扩展了它们给定的超类并实现了接口,而另一些子类只是扩展了它们的超类。此外,例如类B的一些子类将声明一个方法,该方法也在类B和类a中声明,并在接口中使用

我的问题是-如果扩展二级子类允许它们继承其超类的属性并因此实现接口,那么在二级子类中实现接口的目的是什么

我知道我的逻辑一定有缺陷,一定有原因,因为一些次要子类实现了接口,而其他子类没有

下面是一个实现Idump的示例,而其他一些示例也包含不实现Idump的dumpProperties方法:

public class Q extends B implements Idump {
public void dumpProperties(StringBuffer buf)
{
    String appearance = "1";
    String dumpValue = "Sizable";

    buf.append("\t\t\t//\n");
    buf.append("\t\t\t// " + name + "\n");
    buf.append("\t\t\t//\n");
    buf.append("\t\t\tthis." + (owner != null ? name + "." : "") + "Name = \"" + name + "\";\n");
}


public class B extends A implements Idump {
public void dumpProperties(StringBuffer buf)
    {
        super.dumpProperties(buf);
        for(Control control : controls)
        {
            control.dumpProperties(buf);
        }
    }
}


public class A implements Idump{
public void dumpProperties(StringBuffer buf)
    {
        buf.append("\t\t\t//\n");
        buf.append("\t\t\t// " + name + "\n");
        buf.append("\t\t\t//\n");
        buf.append("\t\t\tthis." + (owner != null ? name + "." : "") + "Name = \"" + name + "\";\n");
        for(Property prop : properties)
        {
            prop.dump(buf);
        }

        if(left != -1 && top != -1 )
        {
            buf.append("\t\t\tthis." + name + ".Location = new System.Drawing.Point(" + left + "," + top + ");\n");
        }
        if(width != -1 && height != -1 )
        {
            buf.append("\t\t\tthis." + name + ".Size = new System.Drawing.Size(" + width + "," + height + ");\n");
        }

        for(Property prop : properties)
        {
            prop.dumpProperties(buf);
        }
    }
}

非常感谢您的帮助

就编译器而言,绝对没有区别。出于可读性的原因,这可以作为一种标记
接口

如果子类没有显式包含实现,那么它将从其“父类”继承该实现;请注意,这意味着其他子类(显式实现它的子类)正在重写父类的实现(这称为)


类似地,每个子类将继承其超级类实现的接口(无论它们是否也被标记为实现接口);这是一个风格和可读性的决定。

关于程序员SE。基本上,语义可能是一个原因。我认为有人可能会在将来决定
a
不需要实现
Idump
;如果
B
有自己的
Idump
方法的实现,但有人从
A
中删除
implements Idump
,它将破坏
B
,除非
B
也说
实现Idump
。但这似乎是一个相当模糊的原因,因为这将是一个重大的设计更改,而且如果
B
对其实现的方法使用
@Override
注释,那么编译器无论如何都会捕获它。