【问题标题】:Call subclasses with static methods使用静态方法调用子类
【发布时间】:2015-09-26 06:30:03
【问题描述】:

我有时需要静态调用子类方法的行为。 例如,我有一组messengers。我需要在每个实现中调用一次或两次,我不想保留它们的超级接口的变量,因为那时我需要为所有人提供一个方法描述,或者所有人都必须覆盖的几个方法描述。而且它们不会是静态的。

我希望能够做Messenger.MessageErrorMessage.send(param)Messenger.MessageDefaultMessage 之类的事情...需要将它们绑定到超类,但在调用子类方法时仍保持静态行为。

所以我在下面做了这个: 接口有公共的内部类,调用子类的静态方法,唯一的改变名称是MessageErrorMessages(实际子类)MessageErrorMessage(内部类)只需将名称从复数名称更改为单数名称。

  Interface Messenger{
     public static final class MessageErrorMessage{
        public static void send(Message message){
          MessageErrorMessages.send(Message);
        }
     }
     public static final class MessageDefaultMessage{
        public static void send(Message message){
           MessageDefaultMessages.send(Message);
        }
     }
  }

interface Messenger的实际实现..

 MessageErrorsMessages implements Messenger {
        public static void send(Message message){
        //..Implementation of send
        }
    }

interface Messenger的实际实现..

   MessageDefaultMessages  implements Messenger{
        public static void send(Message message){
        //..Implementation of send
        }
    }

这样我就不必记住 20 种不同类型的 Messenger 子类并需要保留它们的变量。 这是否违反了任何设计规则?

编辑: 我希望能够写作

Messenger.MessageException.send(message, throwable);

同时

Messenger.MessageDefaultMessage.send(message);

我希望子类具有自己独特的行为和方法声明,但仍收集在 Messenger 下。

【问题讨论】:

  • 我认为主要的设计缺陷是 Message 实现了 Messenger。您将信息(消息)与功能(信使)耦合。不使用 Messenger.sendMessage(message) 之类的原因是什么?
  • 由于我想保持界面整洁,有几个内部类和长方法体,我仍然想将逻辑保留在单独的类中,
  • 嗯,..你能提供一些关于不同消息类型的信息吗?您有什么样的发送(消​​息)行为?据我所知,主要目标是传输消息,我想不出关于如何传输或序列化消息的不同行为。如果您将 throwable 视为信息,您甚至可以使用 send(message) 而不是 send(message, throwable)...
  • 当然,Messenger 静态方法被接收类和 DAOS 等调用,它们被用在不同的包中,例如 DAO 使用 messenger 只发送带有结果的消息,而接收类只在捕获到异常或 DAO 无法控制的其他情况时使用它。调度的每个作业都有自己的队列合同......所以我需要将所有代码分开,但在我需要请求其服务时收集......

标签: java inheritance interface subclass


【解决方案1】:

我不确定您要完成什么(我不确定我是否理解您的问题),但您似乎想基本上覆盖子类中的静态方法,这样您就可以在实例上调用该方法并拥有它委托给子类方法。这根本不可能。任何静态方法都将在您调用它们的类上调用(请注意,您在类上调用静态方法,不是在实例上。如果您尝试调用实例上的静态方法,因为这会掩盖您实际调用它的类)。

【讨论】:

    【解决方案2】:

    如果我理解正确,您希望能够使用来自*Messages 类的静态方法,以及拥有一个委托给适当*Messages 类的通用Messenger 类。除了您提出的方法之外,我看不出您如何做到这一点。

    也就是说,IMO,您应该在应用程序代码中使用 Messenger*Messages 类。两者都使用会导致混乱。

    【讨论】:

    • 不不,我不应该访问消息,只能访问消息,我只能调用委托给实现类的 Messangers 内部类方法。只是在代码中使用它们时不必记住每个消息的名称,这是完全没有必要的,而且不会用长的内部类乱扔接口吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    相关资源
    最近更新 更多