继承java对象的所有getter/setter方法

继承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

我有一个包含许多setter/getter方法的类a,并希望实现一个“扩展a”并提供其他功能的类B

我无法修改类A,并且它没有将类A obj作为参数的克隆或构造函数方法。基本上我实现了类B,这样

  • 它有一个构造函数,该构造函数将a类obj作为参数,并保留该obj的副本

  • 当我们在B上调用setter/getter方法时,它将委托给类A obj

  • 其他功能

类有许多setter/getter方法,我觉得这个实现并不干净,但不确定如何修复它。通常我可以使B扩展A,但在这种情况下,我必须能够将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中会引入新属性。这很难维护,代码看起来很难看。第二种解决方案是最好的。我仍然想知道为什么与其他模式相比,这真的很有用。您似乎试图在运行时更改对象的类型。用谷歌搜索更多的模式。