Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 在这种情况下,下行广播可以接受吗?_Design Patterns_Architecture_Factory_Downcast - Fatal编程技术网

Design patterns 在这种情况下,下行广播可以接受吗?

Design patterns 在这种情况下,下行广播可以接受吗?,design-patterns,architecture,factory,downcast,Design Patterns,Architecture,Factory,Downcast,我目前是一个项目的一部分,该项目创建了一个客户机-服务器模型来自动化某项任务。在项目的某个阶段,我不得不执行downcast来做某些事情。一般来说,向下浇铸意味着你的设计有缺陷。我向我的首席工程师提出了这个问题,但她说 可以将接口向下转换为其派生类,但不能将其转换为具体类 我真的不明白她的解释。在不深入研究主要细节的情况下,我将提供一个描述实际项目场景的伪代码。请注意,以下是一个足够接近的类比 我们有一个基类UniversalAnimal class UniversalAnimal{ p

我目前是一个项目的一部分,该项目创建了一个客户机-服务器模型来自动化某项任务。在项目的某个阶段,我不得不执行downcast来做某些事情。一般来说,向下浇铸意味着你的设计有缺陷。我向我的首席工程师提出了这个问题,但她说

可以将接口向下转换为其派生类,但不能将其转换为具体类

我真的不明白她的解释。在不深入研究主要细节的情况下,我将提供一个描述实际项目场景的伪代码。请注意,以下是一个足够接近的类比

我们有一个基类
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。因此,战略模式并不能完全解决问题。