面向对象设计:这是更好的实践



我对创建对象的不同方式感到困惑,我在java文档和其他编程书籍中看到过这种情况。例如

假设存在base classderived class

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

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

2-我有一个类型为Derived的变量,它指的是类型为Derived 的对象

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

我的问题是,在1和2之间进行选择时,我应该怎么想?它是为了在一般的基础衍生场景中利用Polymorphism吗?

在1和2之间选择时是否存在我不知道的better practice,或者它只是personal decision

编辑:

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

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

更新答案:这实际上被称为"Programming to the interface"。谢谢代码大师。我所寻找的正是这个问题的答案之一——它对";程序到接口";?

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

    使用类实现的接口可以使用实现该接口的所有类,而不仅仅是特定的类。

  2. String是一个具体的类,因此直接使用它要清楚得多。

    然而,有时即使String实现了CharSequence接口,也没有必要使用CharSequence,因为这会让人感到困惑。然而,看看StringBuilder,它几乎完全使用CharSequence

总之,没有更好的,只有合适的

选择基类型可以在将来的某个时候在使用ArrayList(比如LinkedList)之间进行更改,而不更改其余代码。这为您以后的重构提供了更大的灵活性。同样,出于同样的原因,您的公共方法应该返回List而不是特定类型的List实现,这样您就可以更改内部实现以优化性能,而不会破坏与调用方的约定。

在List是一个类的情况下(只是为了回答您的问题而假设-"我们应该使用表示子类的Parent类的对象还是使用派生类类型的对象(actula类)?"

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

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

最新更新