2014-04-04 63 views
3

我正在使用具有类层级的Java库:Java:如何在不修改类文件的情况下添加到基类

例如,类C1和C2都可以扩展B类

有没有一种方法可以让我向B类添加功能(属性,方法),以便它可以在没有修改3个文件的情况下为子类C1 & C2提供?

如果不是,那么重写所有3个班级的做法是否正确?

+1

继承你必须至少是修改B中。 –

回答

3

假设你不能够修改B中的一些原因,使得扩展它为您的中介类:

public class ClassC extends ClassB { 

    //additional functionality 

} 

然后很简单:

public class Class1 extends ClassC {...} 

如果你可以修改乙,其他类已经继承了这些方法,您不必担心重写它们,除非您标记方法abstract

+0

通过这种方式,您可以修改类“C1”和“C2”,而不仅仅是修改一个类“B”。 – SudoRahul

+0

对。我不想这样做。 – GroovyDotCom

+0

@GroovyDotCom你不想做哪个部分,为什么? – Rogue

0

有没有办法让我向B类添加功能(属性,方法),以便在不修改3个文件的情况下,它可用于子类C1 & C2?

您将只需修改类B。如果添加方法,它们将自动被类别C1C2继承,因此您不需要修改这些类。

0

您只需要修改B类。如果向B添加受保护或公共方法,则C1和C2将自动能够调用它,而无需进行任何更改。

0

只需修改B类。无需更改其他文件。

0

似乎这个问题有点模糊,很难说不知道你的意图。

如果你想增强你的类在运行时的行为,那么你可以看看像Javassit或CGLib等,它允许你改变类并添加新的功能,而无需修改源代码原始来源。

如果你正在开发一些东西,并试图找到一个允许你在不改变现有类的源代码的情况下添加功能的设计,那么你可以看看Dectorator模式。

如果您手头只有三个类,并且您不想/不允许修改它们,但您仍然希望添加功能而不更新它们。那么在Java中是不可能的,对不起。 (许多其他语言无论如何都提供这样的功能)

0

无论如何你必须修改类B。可以有两种方法(假设你可以修改B)。

第一:让你想在B直接做更改,因为C1C2延长B已经,方法和字段将在那些阶级作为阶级(仅当它们public or protected,这是)可用。但这需要在B中进行大量更改。

第二个:有一个抽象类扩展了B。在这种情况下,对B的小改动应该足以扩展该抽象类。这样,您添加到抽象类的所有内容都可以在层次结构中的以下所有类中使用。只要确保在抽象类中没有任何抽象方法。

public abstract class ParentOfB { 

    // Additional functionality 
} 

public class B extends ParentOfB { // The only change in B 

} 

之所以ParentOfB是抽象的,是因为你不想使用这些功能的任何其他类没有继承B。如果你需要其他地方的功能,你可以使ParentOfB只是一个普通的课程。

1

如果您不能修改B那么你将不得不把它扩大,并修改C1C2,而不是延长B新类。

如果您不能修改任何这些类的,那么你可以做这样的事情:

  • 新功能创建BX延伸B
  • 创建C1X延伸BX,并包含一个内C1对象。除了委托在BX新方法,所有的方法调用底层C1对象
  • 创建C2X遵循同样的逻辑C1X

这是不漂亮。可能无法正常工作。例如,如果新方法需要处理底层对象的私有数据,那么这将不起作用。但考虑到这些限制,我认为没有其他办法。如果Java有多重继承,它可以工作C1X扩展C1BX,但缺点,恐怕这个肮脏的解决方案是最好的,你可以拥有。 (如果它甚至有效)。

+0

这可以工作,但并不像你说的那样漂亮。我只是有一个想法,也许这可以做得更干净C1X扩展C1和实现增加的功能作为接口委托给通用代码的接口。想想我会先试试这个。 – GroovyDotCom

+0

@GroovyDotCom它怎么样了? – janos

+0

根据你的发布我的回答。没有投票,所以我不确定是否有人同意。 – GroovyDotCom

0

这是我想出的答案。这是Janos写的一个变体,但我认为它更好。我不需要更改任何类,可以重新使用任何子类中的扩展,并继续从新的扩展子类继承。尽管如此,仍然需要委托方法。

因此,例如: 注意以下D1已经是如何从B1,C1和B_EXTRA_IMPL

public class B1 { 
     public void b1() {  
      System.out.println("B1"); 
     } 
    } 


public class C1 extends B1 { 
    public void c1() {  
     System.out.println("C1"); 
    } 
} 

-------------------------- Adding New B1 Functionality to C1 --------------------- 

public interface B_EXTRA { 
    void b_extra(); 
} 

public class B_EXTRA_IMPL implements B_EXTRA { 

    public B1 m_b1; 

    B_EXTRA_IMPL(B1 base) { 
     m_b1 = base; 
    } 

    @Override 
    public void b_extra() { 
     System.out.println("b_extra");  

    } 
} 

public class C1X extends C1 implements B_EXTRA { 
    B_EXTRA_IMPL b_extra; 

    C1X() { 
     super(); 
     b_extra = new B_EXTRA_IMPL((B1)this); 
    } 

    public void b1() 
    {   
     System.out.println("B1"); 
    } 

    @Override 
    public void b_extra() { 
     b_extra.b_extra(); 
    } 
} 

public class D1 extends C1X { 
} 

public class Main { 
    public static void main(String[] args) { 
     D1 d = new D1(); 
     d.b1(); 
     d.c1(); 
     d.b_extra(); 
    } 
} 
相关问题