如何为扩展 JDialog 的类(或通常是另一个类)创建接口

Posted

技术标签:

【中文标题】如何为扩展 JDialog 的类(或通常是另一个类)创建接口【英文标题】:How to create an Interface for a class that extends JDialog (or in general another class) 【发布时间】:2016-06-04 17:46:36 【问题描述】:

我正在开发一个使用 Swing 的 Java 应用程序。 我有一个扩展 JDialog 的类,如下所示:

public class customDialog extends JDialog 
    //Custom buttons listeners etc.

现在为它创建接口的方式(最佳实践)是什么? 我会写:

public interface customDialogInterface 
    //Custom methods signatures

然后在 customDialog 中使用“实现 customDialogInterface”,但是以这种方式,当我在代码中使用 customDialogInterface 时,我无法访问 JDialog 方法。 否则 JDialog 是一个类,所以我不能在我的界面中扩展它。此外,我无法使用 JDialog 实现的接口扩展 customDialogInterface,因为其中之一是包保护的。

在那些(我想是公地)情况下,正确的处理方式是什么?


更新 1: 我将尝试更好地解释我的问题。 有一个编程原则告诉“程序使用接口而不是具体类”。在此基础上,如何为我的 CustomDialog 创建一个界面? 如果我这样做:

public interface CustomDialogInterface 
    public void doA();
    public void doB();

比我使用 CustomDialog 的代码:

CustomDialogInterface myDialog = new CustomDialog();
myDialog.doA();    //OK
myDialog.doB();    //OK
myDialog.setVisible(true);    //ERROR

更新2:我决定再次更新我的问题,因为根据答案似乎不是很清楚。它没有太多信息,因为它还不是真正的代码,它只是一个理论问题。另外,如果我还没有找到可能的解决方案,我会以另一种形式再次在这里写:

    在我的应用程序中,我需要一个包含我的信息、字段等的 JDialog。 我怎样才能获得它? 定义一个类:

    类 MyImplementation 扩展 JDialog 公共doA(字符串txt) //这是我实现的特定方法

    现在,我想遵循良好的编程规则“通过接口编程,而不是通过实现”,所以我需要一个自定义对话框的接口

    界面 InterfaceForMyDialog 公共doA(字符串txt);

    MyImplementation 类必须实现接口,所以我更改上面的伪代码只是添加和实现

    类 MyImplementation 扩展 JDialog 实现 InterfaceForMyDialog 公共doA(字符串txt) //这是我实现的特定方法

    现在最后我需要在外部代码中的某处使用我的新对话框(比如说在 main 方法中的某处),如下所示:

    ... InterfaceForMyDialog myDialogInterface = new MyImplementation(...);

问题: 您应该如何完成上面的代码以使用方法“doA(String txt)”为我的自定义对话框设置一些文本,然后显示对话框本身? 我认为使用这种结构是不可能的,我找到了一个使用抽象类的解决方案(见下文)。如果我错了或者有更好的解决方案解释请写在这里。

【问题讨论】:

什么错误?复制并粘贴到这里。是编译错误吗? 也许你应该看看Inheritance。根据您有限的信息,我建议您只实现接口而不是扩展对话框,如 Andrew 所述 【参考方案1】:

你是正确的,你只能扩展一个类;由于是扩展 JDialog,所以可以实现 0 个或多个接口,但不能扩展另一个类。

如果你的界面有两种方法:

public interface customDialogInterface

  public void doA();
  public int  doB();

那么你的班级可以有

public class customDialog extends JDialog implements customDialogInterface

只要customDialog 有方法doA()doB()

注意:按照惯例,类名和接口名都以大写字母开头。如果您使用 CustomDialogCustomDialogInterface,全世界的 Java 程序员会发现更容易理解您的代码。

【讨论】:

编辑:我更新了原始问题而不是写评论。 当你问关于 SO 的问题时,不要只说“错误”或“它不起作用”。复制错误并将其粘贴到您的问题中。说什么不起作用,说它是编译时还是运行时(你在这里做了)等等。试着想象我们在互联网上的所有人都是第一次看到你的问题的任何部分.如果您有一个 CustomDialog 的实例,并且它扩展了 JDialog,并且您使用布尔值对其调用 setVisible,则此时不应出现编译错误。 嗨 arcy,这不是一个真正的错误,它只是一个示例。我的意思是我想在 CustomDialogInterface 上调用 setVisible(true) 方法,但我不能,因为该方法是 JDialog 的一种方法,并且没有在接口中定义。顺便说一句,我找到了一个灵魂,将 CustomDialogInterface 作为抽象类而不是作为接口。无论如何,感谢您查看我的问题。最好的, 就目前而言,您似乎对扩展类和实现接口的类的工作方式存在误解。我想为你澄清一下。如果 CustomDialog 扩展了 JDialog,则没有理由不能在 CustomDialog 上调用 setVisible(),无论它是否实现了(其他)接口。【参考方案2】:

好的,我找到了解决方案。 我没有将 CustomDialogInterface 声明为接口,而是将其声明为扩展 JDialog 的抽象类。然后我用提供实现的类扩展这个抽象类。 如果有更好的解决方案,请告诉我!

【讨论】:

这是否更好取决于您没有告诉我们的事情。完全可以扩展 JDialog 并实现接口;如果您有错误,请告诉我们错误是什么以及何时出现。这里有些人坚持运行代码,这就是为什么 - 提供足够的信息通常没有足够的(或太多的)想法。

以上是关于如何为扩展 JDialog 的类(或通常是另一个类)创建接口的主要内容,如果未能解决你的问题,请参考以下文章

如何为User.php扩展多个内容

如何为同一服务使用@Autowired 注解两个或多个不同的组件类?

如何为类的每个实例创建实例特定的方法?

如何为联合成员提供一个简单的类构造函数?

如何为朋友函数中定义的类授予友谊?

如何为不同的类调用 querySelector? [关闭]