我想要两个类:Layout1和Layout2。两者都将扩展特定的类,Layout1将扩展LayoutGroup1,Layout2将扩展LayoutGroup2。
但是,它们都会以名为doSpecialLayout()的函数形式提供一些公共代码。
理想情况下,我可以让每个类扩展其适当的类,并将共享的doSpecialLayout()代码放在一个可以访问的公共位置。这将使我的清洁更加清晰,并且由于我每次都不会编辑两个课程而提高我后来修复错误的能力!
这样的事情可能吗?我知道我不能用Java扩展多个类,那么我在这里寻找的模式是什么?
非常感谢!
FYI这适用于Android系统上的Java,因此仅支持Java 6(7?)。
答案 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()
。然后将此类的实例包含在您需要的LayoutGroup1
和Layout2
电话doSpecialLayout()
中。
此外,如果您希望方法doSpecialLayout()
是公共的(公共API的一部分),则必须创建具有此方法的单独接口。然后,LayoutGroup1
和Layout2
可以实现该接口,并将doSpecialLayout()
的调用委托给SpecialLayout
的内部实例。