是否有一种方法可以根据派生的可能性值范围限制对象参数



我正在尝试制作动物数据库。如何使每个动物物种具有一些具有固定值的参数,有些具有一系列可能的值,因此每个物种的个体(对象(可以从中"选择"?

从基本的OOP中,我可以有一只狗,带有"雷克斯"one_answers" fido"的物体,然后是一只鸟,带有"岩石"one_answers"可可"的物体。我为他们创建了一个基类动物的基类,所有参数均常见,如下所示。

当我创建班狗时,我如何修复我希望所有狗都有的body_parts(所有狗都有头,腿,尾巴等,但没有翅膀(,我该如何为每个狗设置一系列可能的值从狗中挑选的狗的对象(因为狗可能是黑色,棕色或白色,也许是两者的混合物,但绝不是绿色,也不是蓝色(?

#include <string>
#include <vector>
enum class Body_Part
{
    HEAD,
    WING,
    ...,
    TAIL;
};
enum class Color
{
    BLACK,
    RED,
    WHITE,
    BROWN,
    GREEN
    BLUE;
};
class Animal
{
public:
    Animal();
    ~Animal();
private:
    std::string m_Species;
    std::vector<Body_Part> m_Limbs;
    std::vector<Color> m_Colors;
}
class Animal
{
public:
    Animal(std::vector<Color> allowedColors, std::vector<BodyPart> requiredLimbs)
      : m_Limbs(requiredLimbs), m_colors(allowedColors)
    {}
// ...
};

然后,每个派生的班级必须在施工时间决定什么。

但是,此代码中有几个混乱可能完全需要不同的设计。

  • 动物实例("岩石"(可以有几个肢体,但只有一种颜色(我认为?(。那么,为什么Animal的每个实例都有颜色列表?

  • 它应该是Animal基类还是每个派生类的工作来分配/提供四肢和颜色?该代码的用户是谁,他们期望做什么?设置四肢和颜色?如果是这样,这应该是Animal接口,还是每个Dog都有一种方法来决定自己的颜色?

  • 四肢是"必需的"列表(给定动物类型的每个实例都必须具有 all 这些四肢(,但是颜色是"允许"列表(每个实例给定动物类型需要恰好是这些颜色的一种(。这是当前在代码中未经反映的含义上的显着差异。

  • ,但是问题变成了给定肢体的"有"。Unicorn是否完成,因为其m_Limb列表包含两个WING S?如果每个独角兽都需要这样做,这将如何有所帮助?m_Limb列表是否对动物实例说实际上只是描述了动物的 ank

  • 在我眼中,所需的肢体和允许颜色的列表不应存储在每个动物实例中,而应是派生类型的某些属性(例如DogHorse(。当您想将类型注入时,您倾向于离开OOP土地并进入模板土地...

显然,实际上不需要我的尝试。与朋友交谈后,他说,当我在做一个数据库时,这一切都在用户界面中完成,而我不需要类,其中包括该类。他说,我将为每个"类和子类"创建一个简单的类,仅用于获取用户输入和记录文件。将屏幕上的信息加载到用户时,应添加限制。

使用上面的示例,我会在文件中有狗和鸟数据,在类似txt的文件中思考:

(animal,body1-body2-...-bodyN,color1-color2-...-colorN)

(dog,head-teeth-tail,black-brown-white)
(bird,head-beak-wing-tail,black-white-yellow-green-red)

当我尝试添加一个"狗对象"(例如" fido"(时,只有狗的信息才能在屏幕上获得,因此" fido"将记录为:

(Fido,head-teeth-tail,black)

这样,我需要为每种动物物种创建一个类,然后为每个物种的个体投入另一个类,并添加了对用户的限制,而不是对班级的限制。谢谢大家,无论如何一切都很有帮助。

最新更新