gpt4 book ai didi

c++ - 关于 C++ 中接口(interface)类的使用

转载 作者:行者123 更新时间:2023-11-28 06:38:22 25 4
gpt4 key购买 nike

我对 C++ 中接口(interface)类的用法有疑问,但不知道它的名称以及如何搜索它。希望你能帮助我,好心。

我将尝试用一个简单的例子来说明我的问题。

我有 5 种不同的可能对象,例如三角形、正方形、矩形、五边形和六边形

所有这些对象都有共同的属性,所以我将有一个接口(interface)类Shape

现在,我想要的是:我将拥有一个 Shape 类对象,并且希望能够将它用作其他 5 个对象之一,因为在运行时进行了选择。

所以我做了类似下面的事情:

class Shape 
{
public:

virtual int getArea()=0;

virtual void setWidth(int w)
{
width = w;
}

virtual void setHeight(int h)
{
height = h;
}


protected:
int width;
int height;
};



class Triangle: public Shape
{
public:

int getArea()
{
return (m_Width * m_Height)/2;
}

};

class Rectangle: public Shape
{
public:

int getArea()
{
return (m_Width * m_Height);
}

};

使用时,我只想创建一个Shape 的对象,并用其中一个派生类对其进行初始化。因此,从那时起,我希望它的行为像该对象的实例一样:

void main(){

Shape* shape;

std::string shapeType;

std::cout<<"Enter Shape Type: triangle or rectangle."<<std::endl;

std::cin>>shapeType;


if (shapeType == "triangle")
shape = new Triangle();
else if (shapeType == "rectangle")
shape = new Rectangle();


shape->setWidth(5);
shape->setHeight(7);

std::cout<<shape->getArea()<<std::endl;


}

到这里没问题。问题从这里开始。这些派生类可能有不同的属性、方法。当我将这些方法添加到它们自己的类时,shape 对象无法(正确地)访问它。可以使用的另一种方法是将新的派生对象转换为形状对象,例如:

Triangle* triangle = (Triangle*)shape;
// now I can access own attributes of Triangle object.

但这并不是你想的那样处理它的好方法。除此之外,我只知道一种方法迫使我将所有这些属性写入 Shape 类并在需要的派生类中实现它们,如果不需要其他类,则将其实现为空。

对于这个问题,你有什么好的解决办法吗?我敢肯定会有,但我对这个主题没有那么多经验,所以希望你有一个适合我想要的解决方案。

提前致谢。

最佳答案

首先,您的Shape 不是接口(interface),而是基本实现类。将它们分开。

接口(interface)是一个只有纯虚方法和虚析构函数的抽象类:

struct IShape
{
virtual int getArea() =0;
virtual void setWidth(int w) =0;
virtual void setHeight(int h) =0;
// without virtual destructor you cannot
// properly destroy object through IShape pointer
virtual ~IShape() {}
};

现在让我们编写基本实现:

class CShapeBaseImpl : public IShape
{
public:
void setWidth(int w) override { width_ = w; }
void setHeight(int h) override { height_ = h; }
protected:
int width_ = 0;
int height_ = 0;
};

在大多数情况下,您希望创建一些具体的对象并仅通过它的界面来使用它。通常是通过 abstract factory pattern 完成的:

std::unique_ptr<IShape> CreateTriangle( int a, int b, int c )
{
auto triangle = std::make_unique<Triangle>(a,b,c);
// there you can work with it as Triangle
return triangle;
}

CreateTriangle 返回后,最好忘记它是 Triangle。现在是 IShape

关于c++ - 关于 C++ 中接口(interface)类的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26400108/

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