Java:如何在不修改类文件的情况下添加到基类

时间:2014-04-04 07:24:56

标签: java inheritance

我正在使用具有类层次结构的Java库:

e.g。类C1和C2都扩展了B类

我有没有办法向B类添加功能(属性,方法),以便它可供子类C1& C2没有修改3个文件?

如果没有,那么在没有重写所有3个类的情况下,正确的方法是什么?

8 个答案:

答案 0 :(得分:3)

假设您因某些原因无法修改B,请创建一个为您扩展它的中间类:

public class ClassC extends ClassB {

    //additional functionality

}

然后很简单:

public class Class1 extends ClassC {...}

如果你可以修改B,其他类已经继承了这些方法,除非你标记方法abstract

,否则你不必担心重写它们。

答案 1 :(得分:1)

如果您无法修改B,则必须对其进行扩展,并修改C1C2以扩展新课程,而不是B

如果您无法修改任何这些类,那么您可以执行以下操作:

  • 使用新功能
  • 创建BX扩展B
  • 创建C1X扩展BX,并包含内部C1对象。将除BX中的新方法之外的所有方法调用委托给基础C1对象
  • 按照与C2X
  • 相同的逻辑创建C1X

这很不错。也许不行。例如,如果新方法需要操纵底层对象的私有数据,那么这将无法工作。但鉴于这些限制,我不认为还有另一种方式。如果Java具有多重继承,那么C1X可以扩展C1BX,但如果不这样做,我担心这种肮脏的解决方案是您可以获得的最佳解决方案。 (如果它甚至有效。)

答案 2 :(得分:0)

  

我有没有办法向B类添加功能(属性,方法),以便它可供子类C1& C2没有修改3个文件?

您只需要修改课程B。如果添加方法,它们将自动由类C1C2继承,因此您无需修改​​这些类。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

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

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

答案 6 :(得分: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}}只是正常的类。

答案 7 :(得分: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();
    }
}