我正在处理几类食物,分类为
肉类可以是猪肉或牛肉。
从功能上来说,我可以描述食物中三种食物类别中的哪一种(包括知道肉类是牛肉还是猪肉,如果食物不是other
),感谢int ID
。然后,我可以通过在某个给定数组的给定行输出它的某些特征来对待食物。
就代码而言,我希望能够写出如下内容:
// client code
Food SomeFood = new Food(ID); // int ID is given
SomeFood.FillTo(thearray, therow); // where object[,] thearray has to be filled and int therow is the row to be filled
其中FillTo
取决于食物的类型(不包括煮熟的肉+类型)。
当然,我可以设计一个唯一的“客户”类Food
包含所有信息,以便SomeFood
FillTo
根据类型为thearray
填充信息SomeFood
Food
,但我不想这样做。
我想定义一个类层次结构,如下所示:一个基类Meat
类,派生CookedMeat
和Food
类,使得非(煮熟或未煮)的情况将由基类// more verbose client code
// int ID is given
ATypeOfFood = gettypefrom(ID);
if (TypeOfFood.Other == ATypeOfFood)
{
AFood = new OtherFood(ID);
OtherFood.FillTo(thearray, therow);
}
else if (TypeOfFood.CookedMeat == ATypeOfFood)
{
AFood = new CookedMeat(ID);
OtherFood.FillTo(thearray, therow);
}
// etc etc ...
处理,另外两个案例由派生类处理,肉类的类型由两个派生类共有的枚举成员处理。
我的问题如下:我觉得想要写一个最小的客户端代码,因为上面的一个意味着我不需要一个类层次结构设计,如果我想要一个类层次结构设计,那么我被迫写下来用ID来解决食物类型的确定,然后根据它来确定正确类型的食物:
Food AFood = new ADerivedClass(ID)
我错了吗?
是否有可能以某种方式包含基类Food
内的c++
?或者甚至通过设置功能在外面? (我可以看到如何使用c#
中的指针执行此操作,但不能在c#
中查看,因为在设置基类之前无法实例化基类。)
备注。 c#
标签就在那里,因为我是在[i]
语言项目中这样做的,这是我不熟悉的语言,我正在学习。
答案 0 :(得分:0)
这是一个非常广泛的问题,但请试试。
首先,这当然是关于平衡的。你不想牺牲"用户有一个干净的API来编程"对于"我的图书馆关于OOP"超级明确。
为好的API指导咒语" - 他们
含义:在实施解决方案时,您会记住yagni - 您避免实施您今天不需要的东西。但是:当您向"客户"提供API时,您不希望在将来的版本中打破它们。
因此:您必须退后一步,澄清自己的用例是什么 - 从您的用户的角度来看API。您确保您的API允许他们编写富有表现力的强大代码来执行他们必须执行的操作。在某种程度上,您希望为将来可能预见的未来变化做好准备。
来自那里: