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

时间:2014-09-26 13:29:47

标签: java android

我想要两个类:Layout1和Layout2。两者都将扩展特定的类,Layout1将扩展LayoutGroup1,Layout2将扩展LayoutGroup2。

但是,它们都会以名为doS​​pecialLayout()的函数形式提供一些公共代码。

理想情况下,我可以让每个类扩展其适当的类,并将共享的doSpecialLayout()代码放在一个可以访问的公共位置。这将使我的清洁更加清晰,并且由于我每次都不会编辑两个课程而提高我后来修复错误的能力!

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

非常感谢!

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

8 个答案:

答案 0 :(得分:1)

使用Java 8,您可以使用interfaces而不是abstract classes轻松实现此目的。 使用interface方法定义default,该方法将保留常用功能。

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();
    }
}

Java 6:中,只需使用parent class.

即可
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();
    }
}

答案 1 :(得分:0)

LayoutGroup1和LayoutGroup2都可以使用doSpecialLayout()方法扩展一个类。 你也可以创建接口和定义方法doSpecialLayout(),但是你需要在实现这个接口的所有clasess中实现方法。

答案 2 :(得分:0)

LayoutGroup2和LayoutGroup1可以从另一个具有方法doSpecialLayout()的类扩展 所以创建一个新类,在那里实现该方法,并从那个

中扩展LayoutGroup类

答案 3 :(得分:0)

看一下Decorator模式。它可以动态创建包含您想要包含的各种方法/行为的类。

答案 4 :(得分:0)

您可以简单地将公共代码放在静态方法中。

答案 5 :(得分:0)

我认为你正在寻找战略模式。

此模式使用合成而不是继承。

因此,您创建了一个新类,我们可以说SpecialLayoutBehaviour扩展了LayoutBehaviour

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

E.g。

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

public class Layout2 extends LayoutGroup2 {
    private LayoutBehaviour behaviour;

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

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

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

这也允许您创建具有不同特殊布局行为的布局。 例如。让我们说layout3使用boringLayoutBehaviour

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();
    }
} 

答案 6 :(得分:0)

使用Java8和接口使用默认方法

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

public class Layout1 extends LayoutGroup1 implements LayoutGroupInterface 

检查this blog以获取一些示例

答案 7 :(得分:0)

检查" Composition over inheritance"范例。在您的情况下,您可以创建具有方法SpecialLayout的第三个类doSpecialLayout()。然后将此类的实例包含在您需要的LayoutGroup1Layout2电话doSpecialLayout()中。

此外,如果您希望方法doSpecialLayout()是公共的(公共API的一部分),则必须创建具有此方法的单独接口。然后,LayoutGroup1Layout2可以实现该接口,并将doSpecialLayout()的调用委托给SpecialLayout的内部实例。