Java 当它';有必要吗?

Java 当它';有必要吗?,java,downcast,Java,Downcast,我的公司软件面临着一个令人沮丧的问题,我无法找到解决办法。(这是一个到位的东西,我无法改变整个概念) 我将试着用一个例子来说明整个上下文:基本上,我们有两个软件组件,比如BrickHigh,BrickLow。BrickLow可以使用BrickHigh中的所有东西,但BrickHigh看不到BrickLow 在BrickHigh中有一个动物类(数十个属性)及其DAO: public class Animal .. { //attributes... } 在BrickLow中,我创建了一个Cat

我的公司软件面临着一个令人沮丧的问题,我无法找到解决办法。(这是一个到位的东西,我无法改变整个概念)

我将试着用一个例子来说明整个上下文:基本上,我们有两个软件组件,比如BrickHigh,BrickLow。BrickLow可以使用BrickHigh中的所有东西,但BrickHigh看不到BrickLow

在BrickHigh中有一个动物类(数十个属性)及其DAO:

public class Animal .. {
 //attributes...
}
在BrickLow中,我创建了一个Cat类(还有几十个未映射的属性),它扩展了Animal

public class Cat extends Animal {
//attributes
}
我们打算做的是为每个映射属性创建一个超级类(Animal)。但是我不能在我的应用程序中使用我的animal类,因为整个应用程序都使用Cat,所以会有太多的更改

但很明显,我不能在从DAO获得动物后将其扔给猫,因为Java不允许这样做,而且我需要动物提供的所有信息

因为我的砖房没有看到我的砖房,所以没有动物=新猫()之类的东西;可能

我的第一个想法是在Cat中创建一个构造函数,它将动物作为参数

public Cat(Animal a) {
 super(a);
}
但我的构造函数在我的动物类中必须是什么?它似乎不起作用

但我的构造函数在我的动物类中必须是什么?它似乎不起作用

大概是这样的:

   public Animal(Animal other) {
      this.field1 = other.field1;
      this.field2 = other.field2;
      // etc
   }
但是,我认为使用对象工厂模式可能更好;i、 e.让DAO类接受一个参数,该参数是一个工厂对象,可以创建
Animal
实例。当您在使用BrickLow API的代码中使用DAO(来自BrickHigh)时,您可以使用生产
Cat
实例而不是
Animal
实例的工厂实例化if

但我的构造函数在我的动物类中必须是什么?它似乎不起作用

大概是这样的:

   public Animal(Animal other) {
      this.field1 = other.field1;
      this.field2 = other.field2;
      // etc
   }

但是,我认为使用对象工厂模式可能更好;i、 e.让DAO类接受一个参数,该参数是一个工厂对象,可以创建
Animal
实例。当您在使用BrickLow API的代码中使用DAO(来自BrickHigh)时,您可以使用生产
Cat
实例而不是
Animal
实例的工厂来实例化if。

我不确定我是否完全理解您的问题,但是如果您想从BrickHigh的代码中创建某个动物类的实例,但是,在不了解BrickLow的情况下,您可以使用工厂,也可以使用由DAO的一个或多个属性标识的类对象

例如:

public interface AnimalFactory {
    boolean canInstanciate(AnimalDAO dao);
    Animal instanciate(AnimalDAO dao);
}
public enum AnimalFactories implements AnimalFactory {
    INSTANCE;

    private List<AnimalFactory> factories = new ArrayList<>();


    public void registerFactory(AnimalFactory factory) {
        factories.add(factory);
    }

    @Override
    public boolean canInstanciate(AnimalDAO dao) {
        for (AnimalFactory fac: factories) {
            if (fac.canInstanciate(dao)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public Animal instanciate(AnimalDAO dao) {
        for (AnimalFactory fac: factories) {
            if (fac.canInstanciate(dao)) {
                return fac.instanciate(dao);
            }
        }
        throw new InstanciationException("No factory for that animal");
    }
}
你的砖房将有一套工厂,并将提供一个机制来注册新的工厂

例如:

public interface AnimalFactory {
    boolean canInstanciate(AnimalDAO dao);
    Animal instanciate(AnimalDAO dao);
}
public enum AnimalFactories implements AnimalFactory {
    INSTANCE;

    private List<AnimalFactory> factories = new ArrayList<>();


    public void registerFactory(AnimalFactory factory) {
        factories.add(factory);
    }

    @Override
    public boolean canInstanciate(AnimalDAO dao) {
        for (AnimalFactory fac: factories) {
            if (fac.canInstanciate(dao)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public Animal instanciate(AnimalDAO dao) {
        for (AnimalFactory fac: factories) {
            if (fac.canInstanciate(dao)) {
                return fac.instanciate(dao);
            }
        }
        throw new InstanciationException("No factory for that animal");
    }
}
公共枚举AnimalFactories实现AnimalFactory{
实例;
私有列表工厂=新的ArrayList();
公共无效登记工厂(动物工厂){
工厂。添加(工厂);
}
@凌驾
公共布尔犬舍(动物道){
适用于(畜牧业工厂){
if(工厂CANInstantate(dao)){
返回true;
}
}
返回false;
}
@凌驾
公共动物标本(动物道){
适用于(畜牧业工厂){
if(工厂CANInstantate(dao)){
返回因子实例(dao);
}
}
抛出新的InstanceException(“该动物没有工厂”);
}
}

我不确定我是否完全理解您的问题,但是如果您想从BrickHigh代码中创建某个动物类的实例,但不了解BrickLow,您可以使用工厂,或者使用由DAO的一个或多个属性标识的类对象

例如:

public interface AnimalFactory {
    boolean canInstanciate(AnimalDAO dao);
    Animal instanciate(AnimalDAO dao);
}
public enum AnimalFactories implements AnimalFactory {
    INSTANCE;

    private List<AnimalFactory> factories = new ArrayList<>();


    public void registerFactory(AnimalFactory factory) {
        factories.add(factory);
    }

    @Override
    public boolean canInstanciate(AnimalDAO dao) {
        for (AnimalFactory fac: factories) {
            if (fac.canInstanciate(dao)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public Animal instanciate(AnimalDAO dao) {
        for (AnimalFactory fac: factories) {
            if (fac.canInstanciate(dao)) {
                return fac.instanciate(dao);
            }
        }
        throw new InstanciationException("No factory for that animal");
    }
}
你的砖房将有一套工厂,并将提供一个机制来注册新的工厂

例如:

public interface AnimalFactory {
    boolean canInstanciate(AnimalDAO dao);
    Animal instanciate(AnimalDAO dao);
}
public enum AnimalFactories implements AnimalFactory {
    INSTANCE;

    private List<AnimalFactory> factories = new ArrayList<>();


    public void registerFactory(AnimalFactory factory) {
        factories.add(factory);
    }

    @Override
    public boolean canInstanciate(AnimalDAO dao) {
        for (AnimalFactory fac: factories) {
            if (fac.canInstanciate(dao)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public Animal instanciate(AnimalDAO dao) {
        for (AnimalFactory fac: factories) {
            if (fac.canInstanciate(dao)) {
                return fac.instanciate(dao);
            }
        }
        throw new InstanciationException("No factory for that animal");
    }
}
公共枚举AnimalFactories实现AnimalFactory{
实例;
私有列表工厂=新的ArrayList();
公共无效登记工厂(动物工厂){
工厂。添加(工厂);
}
@凌驾
公共布尔犬舍(动物道){
适用于(畜牧业工厂){
if(工厂CANInstantate(dao)){
返回true;
}
}
返回false;
}
@凌驾
公共动物标本(动物道){
适用于(畜牧业工厂){
if(工厂CANInstantate(dao)){
返回因子实例(dao);
}
}
抛出新的InstanceException(“该动物没有工厂”);
}
}

如果没有一个具体的例子来清楚地说明问题,这一切都只是胡言乱语,没有多大意义。我知道你试图避免发布NDA的代码,但你现在遇到的只是一个很难解释的理论问题,在翻译过程中丢失了微妙的细节。当你开始使用自己的自定义术语,如“母类”(是超级类,对吧?)时,真的很难理解。这也很难解决“在BrickLow中,我创建了一个Cat类”和“因为整个应用程序都使用Cat,所以会有太多的更改”。我同意,我们需要更好地解释您试图做的事情,当然,使用标准Java术语会有所帮助。当您说“在BrickLow中,我创建了一个Cat类”“,您的意思是它是内部的吗?您可以通过反射在BrickHigh中访问Cat类及其实例变量(或getter/setter方法)。这是我的猜测……谢谢你的投入,我尝试过编辑它,但我可能让它变得更糟。没有一个具体的例子清楚地说明问题,这一切都是胡言乱语,没有多大意义。我知道你们试图避免发布NDA的代码,但你们现在遇到的只是一个理论问题,很难用del解释