设计难题:最小客户端代码与多态设计

时间:2017-05-22 08:41:04

标签: c# polymorphism

我正在处理几类食物,分类为

  • 非熟肉
  • 熟肉
  • 不属于前两个类别的其他食物

肉类可以是猪肉或牛肉。

从功能上来说,我可以描述食物中三种食物类别中的哪一种(包括知道肉类是牛肉还是猪肉,如果食物不是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类,派生CookedMeatFood类,使得非(煮熟或未煮)的情况将由基类// 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]语言项目中这样做的,这是我不熟悉的语言,我正在学习。

1 个答案:

答案 0 :(得分:0)

这是一个非常广泛的问题,但请试试。

首先,这当然是关于平衡的。你不想牺牲"用户有一个干净的API来编程"对于"我的图书馆关于OOP"超级明确。

为好的API指导咒语" - 他们

  • 轻松做正确的事情,并且做错事
  • 应为 future 愿景
  • 做好准备

含义:在实施解决方案时,您会记住yagni - 您避免实施您今天不需要的东西。但是:当您向"客户"提供API时,您不希望在将来的版本中打破它们。

因此:您必须退后一步,澄清自己的用例是什么 - 从您的用户的角度来看API。您确保您的API允许他们编写富有表现力的强大代码来执行他们必须执行的操作。在某种程度上,您希望为将来可能预见的未来变化做好准备。

来自那里:

  • 派生一个对API用户有用的对象模型
  • 当你清楚地了解这一点时,请研究如何以一种漂亮,干净的方式实现该模型的问题