在这种情况下向下倾斜是可以接受的吗?

时间:2018-04-23 08:29:59

标签: design-patterns architecture factory 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 
}

因此,通用动物类就像是任何动物的占位者类。注意,它有鳍(鱼),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
}

虽然这是一个检查向下转换,但不会抛出运行时异常;向下铸造通常意味着设计缺陷。此外,如果使用工厂的客户需要知道对象的类型,我相信,使用工厂是一个错误的设计选择。对于这个问题,请给我见解和可能的替代设计(如果这个设计是错误的)。

0 个答案:

没有答案