gpt4 book ai didi

c++ - 多态性的良好实践

转载 作者:行者123 更新时间:2023-11-30 00:46:18 25 4
gpt4 key购买 nike

假设一个 Domain 存储指向 Shape 的指针。确切的形状(TriangleRectangle)在编译时未知,在读取输入后会很清楚。在运行时,我可能需要访问派生结构的变量,但这是不可能的,因为指针指向基础结构。我找到了另一种解决方案,即执行“开启类型”,但正如答案 here 中指出的那样,不鼓励这样做.他还说

When you use polymorphism, you shouldn't need to care about what's behind a base class reference/pointer.

嗯,在这种情况下,我很在意,所以听起来我不应该使用多态性。我想我在下面做的是一个糟糕的设计,但是解决这个问题的好的设计是什么?

struct Shape
{
int common_variable;
};

struct Triangle: Shape
{
int triangle_specific_variable;
};

struct Rectangle: Shape
{
int rectangle_specific_variable;
};

struct Domain
{
Shape* shape;
};

int main()
{
Domain domain;
//domain.shape = new Triangle(); // depends on input.
//domain.shape = new Rectangle(); // depends on input.

return 0;
}

最佳答案

您的问题清楚地表明需要多态性,因为您想要处理三角形、矩形等,并且您知道所有这些都是形状。

为什么不建议使用开关访问特定数据?

因为这恰恰与多态设计相反。而不是处理形状、绘制它们、计算它们的面积等……您总是需要知道形状的类型和代码特定的行为。

想象一下,您已经完成了您的代码,然后您发现您还需要正方形和圆形:维护它会是一场多么可怕的噩梦。

如何解决?

您必须从具体类中抽象出来并定义可以对一般形状执行的一般操作。然后将这些操作定义为虚函数,在您使用域的代码中,只需调用虚函数即可。

要进一步概括,您可以使用从流中返回形状的工厂方法,而不是从类中创建对象。

示例:

class Shape
{
public:
virtual void scale(double scale_factor)=0;
virtual void rotate(double angle)=0;
virtual void draw(window w)=0;
virtual Shape* clone()=0;
virtual ~Shape() {}
};

class Triangle: public Shape
{
Point A, B, C;
public:
Triangle (Point a,Point b, Point c) : A(a), B(b), C(c) { }
void scale(double scale_factor) override;
void rotate(double angle) override;
void draw(window w) override;
Shape* clone() { return new Triangle(*this); }
};

...

int main()
{
Domain domain, domain2;
Window wnd = CreateWindow(...); // depends on your GUI library
Point a,b,c;
cin >> a >> b >> c;
domain.shape = new Triangle(a,b,c);

// Once the object is constructed no need to know the details of the shape here
domain.shape->rotate(45);
domain2.shape = domain.shape->clone();
domain.shape->draw(wnd);
...
return 0;
}

请注意,使用智能指针比使用原始指针更安全;

关于c++ - 多态性的良好实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39110956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com