【问题标题】:Using java abstract class使用java抽象类
【发布时间】:2012-06-06 16:29:57
【问题描述】:

在我的 UI 项目中,我有几个屏幕共享相同的标题样式,只有文本特定于屏幕。什么是实现这一点的好方法?

  1. 让父类创建所有的头部组件,并将组件开放给子类,子类会访问组件的setText方法来更新文本?

  1. 在超类中有抽象方法来创建组件,子类将实现这些方法来创建组件。

希望它有意义..

【问题讨论】:

  • 有抽象方法。这样你就永远不会忘记更改文本,因为你将不得不覆盖它.. 并且将来会更容易找到标题更改的位置.. 只是我的意见
  • 只有文本在屏幕之间变化。换句话说:实现取决于包含该文本的特定StringEsteban Araya's answer 通过其构造函数表达了这种依赖关系。

标签: java class abstract


【解决方案1】:

你真的需要一个抽象类吗?

public class UIScreen {
     public UIScreen(String headerText) {
         //set everything up here w/ the right text
     }
}

// elsewhere ....

UIScreen mainScreen = new UIScreen("Main Screen");

【讨论】:

    【解决方案2】:

    用通用头方法创建抽象类,最好为所有子类定义一个方法来实现。

    【讨论】:

      【解决方案3】:

      取决于您是否希望超类能够被实例化。这就像有一个Animal 超类和DogCat 子类。您是否希望人们能够创建通用的Animal

      如果是这样,它应该是一个正常的类。如果不是,则应声明为abstract

      所以最终的问题是:是否存在默认行为?如果不是,则将其抽象化。

      【讨论】:

        【解决方案4】:

        第二种选择更可行。

        记住:Single Responsibility Principle

        这两个选项都有效,但第二个选项可以减少代码中的耦合。

        【讨论】:

          【解决方案5】:

          当行为不断变化时...将其封装在抽象类或接口中。

          最好有一个

           Abstract class, with the non-abstract method to create the Header, 
          and an Abstract method to create the text
          

          ..在子类中,您可以通过实现抽象方法来创建您选择的文本。

          【讨论】:

          • 那么我需要访问组件,设置组件中的文本(标签),所以为什么不直接将组件打开到子类(但是这样子类不会被强制更改文字)
          【解决方案6】:

          “超类有抽象方法来创建组件,子类会实现这些方法来创建组件。”

          在我看来,这个解决方案更容易维护。

          【讨论】:

            【解决方案7】:

            您可以稍微更改选项 1

            public abstract class SuperUI {
            
               private HeaderComponenet headerComponent;//have getter setter
            
            }
            
            public class BaseUI extends SuperUI{
                private void changeHeaderComponent(){
                   headerComponent.setText("Changed");
                }
            }
            
            public class HeaderComponent extends JComponent{
               public HeaderComponent(){
                  //create the default header here
               }
            }
            

            在这种情况下,如果必须更改默认页眉组件,您不必更改 SuperUI,因为您已将页眉与 SuperUI 分开,如果需要,您可以对页脚组件执行相同操作。

            【讨论】:

              【解决方案8】:

              我的问题是子类有什么有用的功能吗?如果没有,您为什么不只拥有一个具体的类并将其传递给某种数据容器来填充字段?

              如果没有行为差异,那么将数据和/或协作者传递给构造函数或通过属性设置器会更好。

              【讨论】:

              • 除标题样式外,所有子类都有单独的行为。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-01-25
              • 1970-01-01
              • 2016-08-16
              • 1970-01-01
              相关资源
              最近更新 更多