虽然有些晚了,但我对这个问题有更多的价值可添加。
泛型(Generics)用于在提供不同类型定义给客户端同时维护相同实现时使用。考虑以下示例:
const rabbitPopulation = new Population<Rabbit>();
const mousePopulation = new Population<Mouse>();
rabbitPopulation.add(rabbit)
mousePopulation.add(rabbit)
无论是 rabbitPopulation
还是 mousePopulation
,它们都有相同的方法实现,只是类型签名不同。当您以这种方式对代码进行建模时,您隐含地表示所有“种群”应该行为和行动类似。
同时,继承 用于扩展或完全重写实现。
class RabbitPopulation extends Population {
increase() { }
}
const rabbitPopulation = new RabbitPopulation();
class MousePopulation extends Population {
increase() { }
}
const mousePopulation = new MousePopulation();
正如您所看到的,现在
rabbitPopulation
和
mousePopulation
都可以拥有自己实现类似方法的能力。当我们想要捕捉两个对象之间的语义概念(即它们都是人口),同时允许它们在行为上有所不同(每个对象具有不同的方法)时,这非常有用。
您可以使用两者结合起来以非常丰富的方式表达您的建模,使基类成为通用类。请考虑以下内容:
class MousePopulation extends Population<Mouse> {}
这样,您可以在所有“人口”的语义概念中提供类似的基本功能实现,同时以丰富类型的方式为人口的子类型(例如MousePopulation)提供特定的实现。但是大多数情况下,当您这样做时,您几乎总是希望扩展Population<T>
,并且最好将Population
类设置为abstract
类,以获得更多好处。
abstract class Population<T> {}
class MousePopulation extends Population<Mouse> {}
我喜欢这种设置,因为它允许将常见的语义思想捕获在基类中,同时允许子类扩展特定的功能。