我正在使用具有类层次结构的Java库:
e.g。类C1和C2都扩展了B类
我有没有办法向B类添加功能(属性,方法),以便它可供子类C1& C2没有修改3个文件?
如果没有,那么在没有重写所有3个类的情况下,正确的方法是什么?
答案 0 :(得分:3)
假设您因某些原因无法修改B,请创建一个为您扩展它的中间类:
public class ClassC extends ClassB {
//additional functionality
}
然后很简单:
public class Class1 extends ClassC {...}
如果你可以修改B,其他类已经继承了这些方法,除非你标记方法abstract
答案 1 :(得分:1)
如果您无法修改B
,则必须对其进行扩展,并修改C1
和C2
以扩展新课程,而不是B
。
如果您无法修改任何这些类,那么您可以执行以下操作:
BX
扩展B
C1X
扩展BX
,并包含内部C1
对象。将除BX
中的新方法之外的所有方法调用委托给基础C1
对象C2X
C1X
这很不错。也许不行。例如,如果新方法需要操纵底层对象的私有数据,那么这将无法工作。但鉴于这些限制,我不认为还有另一种方式。如果Java具有多重继承,那么C1X
可以扩展C1
和BX
,但如果不这样做,我担心这种肮脏的解决方案是您可以获得的最佳解决方案。 (如果它甚至有效。)
答案 2 :(得分:0)
我有没有办法向B类添加功能(属性,方法),以便它可供子类C1& C2没有修改3个文件?
您只需要修改课程B
。如果添加方法,它们将自动由类C1
和C2
继承,因此您无需修改这些类。
答案 3 :(得分:0)
您只需修改B类。如果您向B添加受保护或公共方法,C1和C2将自动调用它,无需任何更改。
答案 4 :(得分:0)
只需修改B类。无需更改其他文件。
答案 5 :(得分:0)
似乎这个问题有点模糊,如果不知道你的意图就很难说清楚。
如果你想在运行时增强你的类的行为,那么你可能会看到像Javassit或CGLib等,它允许你改变类并为它添加新的功能,而无需修改类的源代码。原始来源。
如果您正在开发某些东西,并试图找到一个允许您在不更改现有类的源代码的情况下添加功能的设计,那么您可以查看Dectorator模式等内容。
如果您手头上只有三个类,并且您不希望/不允许修改它们,但您仍希望在不更新它们的情况下添加功能。那么在Java中是不可能的,抱歉。 (很多其他语言无论如何都提供这样的功能)
答案 6 :(得分:0)
在任何情况下,您都必须修改课程B
。可以有两种方法(假设您可以修改B
)。
首先:直接在B
进行更改,自C1
和C2
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();
}
}