Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在没有设置器的情况下扩展对象以获得超类状态_Java_Oop - Fatal编程技术网

Java 如何在没有设置器的情况下扩展对象以获得超类状态

Java 如何在没有设置器的情况下扩展对象以获得超类状态,java,oop,Java,Oop,我正在扩展一个类来存储我的应用程序所需的一些额外字段,但是我正在扩展的类没有setter方法,只有一个默认构造函数 我使用的框架要求getter与类型中的字段具有正确的命名格式。但是,由于无法从构造函数或setter设置字段,因此我保留了希望存储在新对象中的初始对象的本地副本 然后,我重写了从初始对象提取数据的方法,如下所示: @Override public String getMessage() { return initialPost.getMessage(); } 这似乎不是

我正在扩展一个类来存储我的应用程序所需的一些额外字段,但是我正在扩展的类没有setter方法,只有一个默认构造函数

我使用的框架要求getter与类型中的字段具有正确的命名格式。但是,由于无法从构造函数或setter设置字段,因此我保留了希望存储在新对象中的初始对象的本地副本

然后,我重写了从初始对象提取数据的方法,如下所示:

@Override
public String getMessage() {
    return initialPost.getMessage();
}
这似乎不是一个好的方法,一个恼人的原因是,如果我想使用所有字段,我必须重写所有方法

解决这个问题的最好办法是什么?这会是组合而不是继承的用例吗

我想我可能在这里试图将两者结合起来,这似乎是不正确的

public class MyPost extends Post{

private String postId;
private Post initialPost;
private PostType type;
private Brand brand;
private Product product;
private List<Photo.Image> postImages;
公共类MyPost扩展了Post{
私人字符串posted;
私人邮政;
私有邮政类型;
自有品牌;
私人产品;
私人名单张贴图片;

谢谢你的建议。

你确实把合成和继承结合起来了;这是一个相当混乱的情况。我会选择继承,因为你是在扩展一个对象的行为,而这个对象有着更具体的用途

这也解决了您的问题,因为
Post
类中的
public
方法也可以作为其子类中的
public
方法使用(因此,框架可以愉快地使用
getMessage()
,而无需重新定义它)

以下是我的评论:


Post
本质上是一个不可变的对象,因此它不是由您构建的。您可以覆盖
MyPost
中的
Post
中的方法,并添加您自己的getter/setter,但您应该考虑这是否是您想要采用的方法

您将如何实现此功能的示例:

class Post {
    private String body;

    public String getBody() {
        return body;
    }
}

class MyPost extends Post {
    private String body;

    public void setBody(String body) {
        this.body = body;
    }

    @Override    
    public String getBody() {
        return body;
    }
}

现在
Post
类中的
getBody()
方法被
MyPost

中的自定义方法覆盖了。您是在使用组合还是继承?通过说“扩展它”,您表示继承,但代码意味着组合。我想我已经将这两种东西结合在一起,添加到声明中。我没有设置程序来创建对象,因为Post是不可变的,所以我使用组合来解决这个问题。但我也希望我的新对象是Post类型,因此是继承。我的问题是,什么是最好的方法来消除在这种情况下,框架是真的要使用setter,还是它们只需要存在?问题是,我不能设置初始post对象的任何字段。我没有setter或构造函数,因为它似乎是一个完全不可变的对象。我希望它是post类型,但要存储所有初始post数据a与我的新对象一起使用。
Post
本质上是一个不可变的对象,因此它不是由您构建的。您可以在
MyPost
中重写
Post
中的方法,并添加您自己的getter/setter,但您应该反映这是否是您想要采用的方法。这就是我对解决方案所做的,但我不确定这是否是实现这一点的最佳方法。因为Post是不可变的,这是最好的解决方案吗?这与您所做的不完全一样:您也有一个
Post
对象作为字段-这是不必要的。如果不访问
Post
类:是的,这是我相信的最佳选择。@Jeroenvanevel,我喜欢您的解决方案,但是user1089599应该如何编写setter方法呢?您能举个例子吗?