继承java对象的所有getter/setter方法
我有一个包含许多setter/getter方法的类a,并希望实现一个“扩展a”并提供其他功能的类B 我无法修改类A,并且它没有将类A obj作为参数的克隆或构造函数方法。基本上我实现了类B,这样继承java对象的所有getter/setter方法,java,Java,我有一个包含许多setter/getter方法的类a,并希望实现一个“扩展a”并提供其他功能的类B 我无法修改类A,并且它没有将类A obj作为参数的克隆或构造函数方法。基本上我实现了类B,这样 它有一个构造函数,该构造函数将a类obj作为参数,并保留该obj的副本 当我们在B上调用setter/getter方法时,它将委托给类A obj 其他功能 类有许多setter/getter方法,我觉得这个实现并不干净,但不确定如何修复它。通常我可以使B扩展A,但在这种情况下,我必须能够将A类obj
- 它有一个构造函数,该构造函数将a类obj作为参数,并保留该obj的副本
- 当我们在B上调用setter/getter方法时,它将委托给类A obj
- 其他功能
public class A {
private int x;
public void setX(int x) { this.x = x; }
public int getX() { return this.x; }
}
public class B {
private A a;
public B(A a) { this.a = a; }
public void setX(int x) { a.setX(x); }
public int getX() { return a.getX(); }
public void foo() { ... };
public void bar() { ... };
}
基本上A有很多属性X/Y/Z。。。而且有很多二传手/接球手。如果我这样做,那么B有许多虚拟setter/getter,它们只是委托给a上的同一个调用。有没有更干净的方法来实现这一点?如果类B扩展了类a,它将自动继承其所有非私有非静态方法。在代码中,类A中的getter/setter被声明为public,因此类B将继承它们 然而,要使其工作,您需要如下重写类B的签名,abd删除您在B主体中编写的几乎所有代码:
public class B extends A {
// here, put any functionalities that B provides in addition to those inherited from A
}
这样,您可以通过类型A或B的任何引用访问所有getter/setter,如下所示:
public static void main(String... args) {
A a = new A();
a.setName("Bob");
System.out.println(a.getName());
B b = new B();
b.setName("Joe");
System.out.println(b.getName());
// And even this, thanks to polymorphism :
A ab = new B();
ab.setName("Mike");
System.out.println(ab.getName());
}
我认为您正试图扩展类A的对象以向其添加功能,这造成了这种困境。您无法使用复制构造函数轻松复制,因此您试图使用组合而不是继承,而这是行不通的 三种选择:
- 做你正在做的事情-将类型A的对象包装为B拥有的东西并委托-它可以工作,而且还不错
- 使用B子类A,然后使用某种基于反射的复制例程将所有属性从类型A的对象复制到类型B的新对象中,例如copyProperties函数
- 在类B中创建一个执行所需操作的复制构造函数
public class A {
private int x;
public void setX(int x) { this.x = x; }
public int getX() { return this.x; }
}
public class B {
public B(A a) {
// copy all A properties from the object that we're going to extend
this.setX(a.getX());
}
.. other stuff
}
您描述的问题是扩展对象。扩展一个类很简单——只需将其子类化,就可以得到基本实现和新东西。要使用上述代码扩展对象,请执行以下操作:
A someA = new A();
// a is initialised as an A
B aWithExtraProperties = new B(someA);
// now you have a B which has the same values as the original A plus
// b's properties
// and as B subclasses A, you can use it in place of the original A
我曾经尝试过在运行时像这样更改对象的类型,但感觉不太好。最好考虑一下你为什么要这么做,还有其他的选择。那么,你写了什么代码?你知道,所以用户不会为你分配任务。我不明白为什么在这种情况下你不能让B扩展A,因为A类没有提供一个以obj A为参数的构造函数,而且我没有访问A的源代码的权限。
B
可以有这样的构造函数,没有必要让A
拥有它。这没有捷径,除非您执行类似get(“X”)
的操作并使用反射。我需要一个将obj A作为参数的构造函数,我不能修改类A。那又怎样?我看不出不能修改类A是如何阻止任何其他类声明构造函数接受A的实例作为参数的。谢谢。我对第1和第3种解决方案的主要担忧是A中有许多属性X,并且A中会引入新属性。这很难维护,代码看起来很难看。第二种解决方案是最好的。我仍然想知道为什么与其他模式相比,这真的很有用。您似乎试图在运行时更改对象的类型。用谷歌搜索更多的模式。