Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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_Android - Fatal编程技术网

Java 在实现共享方法时从特定类扩展

Java 在实现共享方法时从特定类扩展,java,android,Java,Android,我想上两门课:第一课和第二课。两者都将扩展特定类,Layout1将扩展LayoutGroup1,Layout2将扩展LayoutGroup2 但是,它们都有一些通用代码,形式为名为doSpecialLayout()的函数 理想情况下,我可以让每个类扩展它们相应的类,并将共享的doSpecialLayout()代码放在一个公共位置,以便两者都可以访问。这将使它在我这方面更干净,以及提高我以后修复bug的能力,因为我不会每次编辑两个类 这样的事情可能吗?我知道我不能在Java中扩展多个类,所以我在这

我想上两门课:第一课和第二课。两者都将扩展特定类,Layout1将扩展LayoutGroup1,Layout2将扩展LayoutGroup2

但是,它们都有一些通用代码,形式为名为doSpecialLayout()的函数

理想情况下,我可以让每个类扩展它们相应的类,并将共享的doSpecialLayout()代码放在一个公共位置,以便两者都可以访问。这将使它在我这方面更干净,以及提高我以后修复bug的能力,因为我不会每次编辑两个类

这样的事情可能吗?我知道我不能在Java中扩展多个类,所以我在这里寻找的模式是什么

多谢各位


仅供参考,这适用于Android系统上的Java,因此仅支持Java 6(7?)。

LayoutGroup1和LayoutGroup2都可以使用doSpecialLayout()方法扩展一个类。
您还可以创建接口并定义方法doSpecialLayout(),但随后您需要在实现此接口的所有类中实现方法。

LayoutGroup2和LayoutGroup1可以从具有方法doSpecialLayout()的另一个类扩展
因此,创建一个新类,在那里实现该方法,并使用
Java8
在LayoutGroup类中扩展该类,您可以使用
接口
而不是
抽象类
轻松实现这一点。 使用将保存公共功能的
默认方法定义
接口

interface someInterface
{
    default void doSpecialLayout(){System.out.println("Hello");}
}

class LayoutGroup1 
{

}
class LayoutGroup2
{

}
class  Layout1 extends LayoutGroup1 implements someInterface
{
    void someFunction()
    {
       doSpecialLayout();
    }
}

class Layout2 extends LayoutGroup1 implements someInterface
{
    void someFunction()
    {
      doSpecialLayout();
    }
}
Java6:
中,只需使用
父类。

class someclass
{
    void doSpecialLayout(){System.out.println("Hello");}
}

class LayoutGroup1 extends someclass
{

}
class LayoutGroup2 extends someclass
{

}
class  Layout1 extends LayoutGroup1 
{
    void someFunction()
    {
        doSpecialLayout();
    }
}

class Layout2 extends LayoutGroup1 
{
    void someFunction()
    {
        doSpecialLayout();
    }
}

看看这个图案。它可以动态创建包含各种方法/行为的类。

您只需将通用代码放在静态方法中即可。

我想您正在寻找策略模式

此模式使用组合而不是继承

因此,您可以创建一个新类,比如说
SpecialLayoutBehavior
,它扩展了LayoutBehavior

public interface LayoutBehaviour {
    void doLayout()
}

public class SpecialLayoutBehaviour extends LayoutBehaviour {
    public void doLayout() {
        //Do something
    }
}

然后在LayoutGroup1和LayoutGroup2类中:

public interface LayoutGroup {
    void doLayoutBehaviour();
}

public abstract class LayoutGroup1 implements LayoutGroup {
    void doLayoutBehaviour();
}

public class Layout1 extends LayoutGroup1 {
    private LayoutBehaviour behaviour;

    public Layout1 () {
        behaviour = new SpecialLayoutBehaviour();
    }

    public void doLayoutBehaviour() {
        behaviour.doLayout();
    }
}
然后对layout2执行同样的操作,即获取LayoutGroup2以实现LayoutGroup

例如

现在LayoutGroupX类可以拥有所需的任何代码,它们将共享特殊的布局行为

这还允许您创建具有不同特殊布局行为的布局。 例如,假设layout3使用了
BoringLayoutBehavior

public abstract class LayoutGroup3 implements LayoutGroup {
    void doLayoutBehaviour();
}

public class Layout3 extends LayoutGroup2 {
    private LayoutBehaviour behaviour;

    public Layout3 () {
        behaviour = new BoringLayoutBehaviour();
    }

    public void doLayoutBehaviour() {
        behaviour.doLayout();
    }
} 

使用Java8和默认方法的接口

public interface LayoutGroupInterface {
    default void doSpecialLayout(){
    }
}

检查一些示例

检查”范例。在您的情况下,您可以创建第三类
SpecialLayout
,该类将具有方法
doSpecialLayout()
。然后将该类的实例包括到您需要的
LayoutGroup1
Layout2
调用
doSpecialLayout()


此外,如果希望方法
doSpecialLayout()
是公共的(公共API的一部分),则必须创建具有此方法的单独接口<然后,code>LayoutGroup1
Layout2
可以实现该接口并委托
doSpecialLayout()的调用
SpecialLayout

的内部实例,您不能为LayoutGroup1和LayoutGroup2使用一个公共父类吗?请查看Java 8中具有默认方法的接口。不过,LayoutGroup1和LayoutGroup2已经需要不同的父类。它们都是布局类型,但不是常见的布局类型,如果有意义的话。我将看看接口/默认方法,谢谢你的建议。仅供参考,这是针对Android工作的,所以我认为他们还不支持Java 8,但最好还是检查一下。您可以通过groovy特性获得与默认接口方法相同的效果,但这只是供您参考,问题与Java相关。在Java 8中,您有与默认方法的接口。很好,类似于groovy trait,我当然可以使用接口来确保共享此公共逻辑的每个类都实现它。我只是希望把这个逻辑放在一个地方。正如MichałUrbaniak提到的,使用默认方法,不要在实现类时重写它。当然,这很简单。但是LayoutGroup1扩展了SpecialLayout1,而LayoutGroup2扩展了SpecialLayout2。因此,它们的父类在被扩展时存在差异。。。因此,不幸的是,这不会起作用。因此,在extends中不要做更多的事情,使用一些常用方法创建一个类,比如doSpecialLayout(),也可以使用singleton模式创建一个实例,在您需要的地方创建一个实例。这正是我在评论中建议的,但没有作为答案发布:)我也打算提出这个建议,希望我刷新了页面。除了你的回答之外,我们还可以出于“教育”的目的添加一个选项,即OP试图做的事情听起来像一个或一个混音器。“从另一个类导入某种常见行为”通常意味着使用一种特性。我们也可以说Groovy2.3提出了特性,Scala也提出了特性。
public interface LayoutGroupInterface {
    default void doSpecialLayout(){
    }
}
public class Layout1 extends LayoutGroup1 implements LayoutGroupInterface