面向对象设计:哪种方法更好?

时间:2013-02-17 23:41:12

标签: java oop class interface

我在创建对象时遇到了混乱,我在java docs和其他编程书籍中看到过。例如,

假设有base classderived class

1-我有一个Base类型的变量,它引用Derived类型的对象

List<String> list = new ArrayList<String>();

2-我有一个Derived类型的变量,它引用Derived类型的对象

ArrayList<String> arrList = new ArrayList<String>();

我的问题是在1和2之间选择时我的想法是什么?是否在一般的Base-Derived场景中利用Polymorphism

在我不知道的情况下选择1到2之间是否有better practice,或者它只是personal decision

修改

抱歉,List是一个界面。 另一个问题:如果我使用Type参数,我的决定会改变吗?

ArrayList<T> list = new ArrayList<T>();

更新答案:这实际上称为"Programming to the interface"。谢谢Code-Guru。在这个问题的一个答案中,我用非常简单的术语解释了我所寻找的正确内容 - What does it mean to "program to an interface"?

3 个答案:

答案 0 :(得分:4)

  1. List不是基类,而是interface,因此应该尽可能使用。

    使用类实现的接口允许您使用实现接口的所有类,而不仅仅是特定的类。

  2. String是一个具体的类,所以直接使用它会更清楚。

    但是,有时即使String实现CharSequence接口,也不必使用CharSequence,因为它只会令人困惑。不过,请查看StringBuilder,它几​​乎完全使用CharSequence

  3. 总结 - 没有更好只有适当的

答案 1 :(得分:3)

选择基类型允许您在将来的某个时刻使用ArrayList来表示LinkedList,而无需更改其余代码。这为您以后的重构提供了更大的灵活性。同样,出于同样的原因,您的公共方法应返回List而不是特定类型的List实现 - 这样您就可以更改内部实现以优化性能而不会违反与调用者的合同。

答案 2 :(得分:1)

在List是一个类的情况下(假设是为了回答你的问题 - )我们应该使用表示子类的Parent类的对象还是使用类派生类的对象(actula类)?“< /强>

1)你是对的,它只是为了多态性的目的。

2)主要用于将对象传递给不同的类方法。其他类的方法可能是接受父类的输入。你必须在那些地方使用铸件。