我目前是创建客户端 - 服务器模型以自动执行某项任务的项目的一部分。在项目的某个时刻,我不得不进行垂头丧气以做某些事情。通常,向下铸造意味着您的设计存在缺陷。我把这个问题提交给我的首席工程师,但她说
将接口转发到其派生类但不是具体类
是可以的
我真的不明白她的解释。在不深入研究主要细节的情况下,我将提供描述实际项目场景的伪代码。请注意以下是足够接近的类比。
我们有一个基类UniversalAnimal
class UniversalAnimal{
private:
Type type;
Colour color;
int weight;
int legs;
int wings;
int fins;
int fangs;
// other common attributes for all animals; getters and setters
}
因此,通用动物类就像是任何动物的占位者类。注意,它有鳍(鱼),f牙(蛇)和翅膀(鸟)。
有AnimalFactory
个类根据GenericAnimal
返回interface
Type
。例如,
GenericAnimal animal = animalFactory.getAnimal(uniAnimal)
从工厂获得GenericAnimal
后;有一些特定于模型的方法需要在程序中进一步处理。为了调用这些特定方法,必须将GenericAnimal animal
向下转换为相应的派生类。例如;
class Snake implements GenericAnimal{
int poisonLevel;
int fangLength;
int length;
bool isPoisonous;
void setPoisonLevel(int level){
this.poisonLevel = level;
}
int getPoisonLevel const{
return this.poisonLevel;
}
// other getters and setters
// other methods overriding interface GenericAnimal
}
将毒药水平设定为蛇;
UniversalAnimal uniAnimal = UniversalAnimal();
uniAnimal.setType(Type::SNAKE);
uniAnimal.setColour(Colour::BROWN);
uniAnimal.setFang(2);
uniAnimal.setFins(null);
//irrelevant attributes to snake like wings, fins are set to null by default
GenericAnimal gAnimal = animalFactory.getAnimal(uniAnimal);
if(gAnimal instanceof Snake)
// checked downcasting
Snake snake = (Snake) gAnimal;
snake.setPoisonLevel(3);
// call other methods specific to snake
}
虽然这是一个检查向下转换,但不会抛出运行时异常;向下铸造通常意味着设计缺陷。此外,如果使用工厂的客户需要知道对象的类型,我相信,使用工厂是一个错误的设计选择。对于这个问题,请给我见解和可能的替代设计(如果这个设计是错误的)。