Design patterns 在这种情况下,下行广播可以接受吗?
我目前是一个项目的一部分,该项目创建了一个客户机-服务器模型来自动化某项任务。在项目的某个阶段,我不得不执行downcast来做某些事情。一般来说,向下浇铸意味着你的设计有缺陷。我向我的首席工程师提出了这个问题,但她说 可以将接口向下转换为其派生类,但不能将其转换为具体类 我真的不明白她的解释。在不深入研究主要细节的情况下,我将提供一个描述实际项目场景的伪代码。请注意,以下是一个足够接近的类比 我们有一个基类Design patterns 在这种情况下,下行广播可以接受吗?,design-patterns,architecture,factory,downcast,Design Patterns,Architecture,Factory,Downcast,我目前是一个项目的一部分,该项目创建了一个客户机-服务器模型来自动化某项任务。在项目的某个阶段,我不得不执行downcast来做某些事情。一般来说,向下浇铸意味着你的设计有缺陷。我向我的首席工程师提出了这个问题,但她说 可以将接口向下转换为其派生类,但不能将其转换为具体类 我真的不明白她的解释。在不深入研究主要细节的情况下,我将提供一个描述实际项目场景的伪代码。请注意,以下是一个足够接近的类比 我们有一个基类UniversalAnimal class UniversalAnimal{ p
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
}
因此,通用动物类就像任何动物的占位符类。注意,它有鳍(鱼)、尖牙(蛇)和翅膀(鸟)
有一个AnimalFactory
类,它根据类型
返回一个GenericAnimal
接口
。比如说,
GenericAnimal animal=animalFactory.getAnimal(单动物)
从工厂获得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
}
尽管这是一个已检查的向下广播,不会引发运行时异常;向下浇铸通常意味着设计缺陷。另外,如果使用工厂的客户需要知道对象的类型,那么我相信,使用工厂是一个错误的设计选择。请给我一些关于这个问题的见解和可能的替代设计(如果这个设计是错误的)。这似乎违反了Liskov替代原则()。与其低声下气,不如使用策略模式来定义处理不同类型对象(或动物)的逻辑?嘿,谢谢你的回答。我需要一个项目中更底层的派生类的POJO。因此,战略模式并不能完全解决问题。