【问题标题】:How to apply polymorphism in this object如何在这个对象中应用多态性
【发布时间】:2017-06-21 21:51:05
【问题描述】:

我有以下课程

class Message{
    private List content;
    private String messageType;

    public Message(String messageType, List content){
       this.content = content;
       this.messageType = messageType;
    }
}

好吧,现在想象一下我想发送不同的消息类型。例如,消息类型“朋友”。我想将他们的 ID 号(例如int)存储为查找他们姓名(String)的密钥。这提醒我应该使用HashMap 类。或者一个简单的String,随便。以及其他更多我需要使用其他对象类型的情况。

这里的主要问题是:我应该如何继续编写具有两个属性的类:

  • 第一个存储消息的类型
  • 第二个是内容本身,应该可以是任何一种对象

我已经读过强制转换是一种不好的做法,所以我不想将 content 声明为对象,然后将其强制转换为消息类型的函数。

我的想法:

  • 将消息声明为抽象类,然后在消息类型的函数中实现子类。我在这里没有得到的是,如果我在 Message 类中声明像 getContent() 这样的抽象方法,我需要稳定它返回的数据类型,什么让我回到主要问题。这种方式没用,因为我需要发送 Message 而不是子类。

【问题讨论】:

  • 当谈到“多态性”时,如果你的类没有任何行为,那就没有任何意义。

标签: java types casting polymorphism message


【解决方案1】:

你根本不需要messageType,你可以用class定义一个泛型类型并在content中使用它,例如:

class Message<T> {
    private List<T> content;

    public Message(List<T> content){
        this.content = content;
    }
}

现在,假设类型是String,你可以这样做:

Message<String> message = new Message<>(new ArrayList<String>());

这样,您可以实例化具有不同类型的Message 类。 Here 是关于泛型类类型的文档。

【讨论】:

  • 现在我想问你这个问题,如果messageType 帮助程序知道如何处理它,例如,如果我发送一个类型为“搜索”的消息,那么内容(有一个关键字为String)并用它在谷歌搜索,messageType 有意义吗?
  • @JD0001 : 这意味着一个糟糕的设计
  • 您能与我分享正确执行此操作的资源吗?
  • @JD0001 您可以将类型T 设置为泛型类型,并在不同的实现中覆盖该方法。
【解决方案2】:
 class Message{
        private List content;
        private HashMap<String,Integer> messageType = new HashMap<String,Integer>();

        public Message(HashMap messageType, List content){
            this.content = content;
            this.messageType = messageType;
    }
    }

这段代码有意义吗???

【讨论】:

  • 显然不是,只是整节课太长了。这只是试图解释自己的代码片段。它是一个客户端-服务器连接,客户端向服务器发送消息,然后服务器回复客户端。
【解决方案3】:

您可以拥有一个包含适用于所有消息类型的通用方法的接口,并且让所有消息都实现 Sendable 接口。

界面

 interface Sendable {
  public String getContent();
  public MessageType getMessageType();
}

消息类

public FriendMessage implements Sendable {

    private String title;
    private Map friends;
    private messageType = MessageType.Friends;

    public String getContent(){
     return title+ friends.toString();
     }

    public MessageType getMessageType() {
     return this.messageType;
   }
}

枚举

public Enum MessageType {
 Friends, NoFriends, Lonely
}

您还应该有一个 Enum 可以对所有消息类型进行分类。这将允许您确定消息类型,而无需进行instanceof 或字符串比较。

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多