访问派生属性和给定基指针的方法的更简单方法

More simple way to access derived properties & methods given base pointer

本文关键字:方法 指针 更简单 派生 属性 访问      更新时间:2023-10-16

现在,我有此代码,它正常工作。为了在给出基本类型防御*时设置对象类型大炮的属性*,我将大炮*施放并使用它来设置属性。

void fillProperties(Defense* defense)
{
    if (defense->getType() == "Cannon")
    {
        Cannon* c = (Cannon*)defense;
        double cannonBallDamage, cannonBallSpeed, blastRadius;
        cout << "Cannon ball damage (hp): ";
        cin >> cannonBallDamage;
        cout << "Cannon ball speed (ft/sec): ";
        cin >> cannonBallSpeed;
        cout << "Blast radius (ft): ";
        cin >> blastRadius;
        c->setBlastRadius(blastRadius);
        c->setCannonBallDamage(cannonBallDamage);
        c->setCannonBallSpeed(cannonBallSpeed);
    }
}

setBlastRadiussetCannonBallDamagesetCannonBallSpeed方法仅存在于加农炮内部,而不存在于防御中。我有6种不同类型的课程,这些课程从防御中获得了自己的额外特性,而Cannon是一个。

我的问题是:比检查对象的类型并为每个指针创建一个新的(铸造)指针以设置其属性更简单吗?

您可以在Defense中添加虚拟方法:

class Defense
{
public:
    virtual ~Defense()
    virtual void fillProperties() = 0;
    // [...]
};
class Canon : public Defense
{
public:
    virtual void fillProperties() override
    {
        cout << "Cannon ball damage (hp): ";
        cin >> this->cannonBallDamage;
        cout << "Cannon ball speed (ft/sec): ";
        cin >> this->cannonBallSpeed;
        cout << "Blast radius (ft): ";
        cin >> this->blastRadius;
    }
    // [...]
private:
    double cannonBallDamage, cannonBallSpeed, blastRadius;
};

访问者模式可用于避免在Defense

中添加太多方法