给定基指针访问派生属性和方法的更简单方法
More simple way to access derived properties & methods given base pointer
现在,我有这段代码,它按预期工作。为了在给定基本类型 Defense* 时设置对象类型 Cannon 的属性,我将 Cannon* 转换为它并使用它来设置属性。
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);
}
}
setBlastRadius
、setCannonBallDamage
和setCannonBallSpeed
方法仅存在于 Cannon 中,不存在于 Defense 中。我有 6 种不同类型的 类,它们来自 Defense,它们具有自己的额外属性,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;
};
Visitor pattern可以用来避免在Defense
中添加太多的方法
现在,我有这段代码,它按预期工作。为了在给定基本类型 Defense* 时设置对象类型 Cannon 的属性,我将 Cannon* 转换为它并使用它来设置属性。
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);
}
}
setBlastRadius
、setCannonBallDamage
和setCannonBallSpeed
方法仅存在于 Cannon 中,不存在于 Defense 中。我有 6 种不同类型的 类,它们来自 Defense,它们具有自己的额外属性,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;
};
Visitor pattern可以用来避免在Defense