2012-06-06 65 views
2

在我的UI项目中,我有几个共享相同标题样式的屏幕,只有文本特定于屏幕。什么将是一个很好的实现方式?使用java抽象类

  1. 有超类创建所有的头组件并打开组件的子类,子类将访问组件的setText方法来更新文本?

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

希望它是有意义..

+4

选择选项1. :-) – maksimov

+0

有抽象方法。这样,你永远不会忘记改变文本,因为你将不得不重写它。并且在将来它将更容易找到头部被改变的位置。尽管我认为 –

+1

只有文本在屏幕之间变化。换句话说:实现取决于包含该文本的特定“字符串”。 [Esteban Araya的回答](http://stackoverflow.com/a/10918371/1332414)通过它的构造函数表达了这种依赖关系。 – Torious

回答

0

创建通用头方法的抽象类,并确定实施将是最好的所有子类的一种方法。

0

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

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

所以最终问题是:是否有默认行为?如果不是,那就把它抽象化。

3

你真的需要抽象类吗?

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

// elsewhere .... 

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

第二种选择是更为可行。

记住:Single Responsibility Principle

两个选项工作,但第二个会走更长的路,以减少代码的耦合。

0

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

其更好地有

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

..In子U类可以通过实现抽象的方法来创建你所选择的文本。

+0

然后我需要访问组件,设置组件(Label)中的文本,为什么不直接打开组件到子类(但是这样子类不会被迫改变文本) – Paneri

0

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

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

0

你可以改变你的选择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分离的头,你如果需要,可以对页脚组件执行相同的操作。

0

我的问题是子类是否有任何有用的功能?如果没有,为什么你不只有一个具体的类,并传递一些数据容器来填充字段?

如果没有行为差异,只需将数据和/或协作者传递给构造函数或通过属性设置器即可。

+0

所有的子类都会除了标题样式以外,还有其他行为。 – Paneri