我最近在阅读A Little Java, A Few Patterns,第3章介绍了<div v-for="week in weeksInMonth">
<cal-week class='cal-week' :weekdata="events['events-week' + $index]" :events="events"></cal-week>
</div>
类及其子类。 Pizza
,Crust
和Cheese
类被定义为Olive
显然,这些是披萨的成分,这些成分和披萨之间的关系是Pizza
而不是has a
。
那么为什么那些成分类被定义为is a
的子类?
仅供参考,下面的代码片段是本书中使用的类结构。
答案 0 :(得分:1)
听起来他们可能被描述为Pizza
的类型;这将使它成为一个 is-a 关系(蘑菇披萨是披萨)。
答案 1 :(得分:1)
子类的名称有些误导。例如,Sausage
不是顶部;这是一个披着香肠的披萨,Cheese
,Olive
和Anchovy
也是如此。 Crust
真是一个没有任何浇头的披萨。以这种方式思考比萨饼可以实现简单的递归描述:
Crust
是递归的基本情况,'toppings'对Pizza
进行递归调用。这就是'浇头'有一个Pizza
字段的原因:子类告诉你生成的披萨的最顶层是什么,字段告诉你底层是什么。
这也使得以递归方式定义方法变得容易。假设我们想检查披萨是否是素食主义者:
如果披萨是一块普通的外壳,那么就没有肉了,所以披萨是素食主义者。 (基本情况:真实)
否则,比萨饼由顶层和子披萨组成。
首先检查顶层。如果顶层是香肠或凤尾鱼,那么比萨饼不是素食主义者。 (基本情况:假)
否则,顶层是奶酪或橄榄。在这种情况下,披萨是素食的,如果只有顶层下面的子披萨是。
检查子披萨是否是素食主义者。 (递归)
如果名称确实让您感到困扰,可以将Crust
重命名为PizzaWithNoToppings
,将Sausage
重命名为PizzaToppedWithSausage
,依此类推。这些名字非常丑陋,并且完全不适合像 A Little Java 这样的风格书。
答案 2 :(得分:1)
虽然这本书的标题包含Java,但它并不是一本关于Java的书。表面上,它是使用Java教授函数式编程。
这是理解这些例子的关键。例如,第一章实际上是关于通常在函数式编程语言(如ML)中找到的Union数据类型(或sum数据类型)。
在本书中,它不使用任何集合概念,如set,map或list。相反,作者教你创建这些概念。
如果您熟悉haskell或SML中的列表类型,那么这些定义应该非常自然。
答案 3 :(得分:0)
class Pizza {
private Set<Ingredient> ingredients;
//code
}
interface Ingredient {}
class Crust implements Ingredient {}
class Cheese implements Ingredient {}
class Olive implements Ingredient {}