2017-07-06 11 views
0

私の会社のソフトウェアのダウンキャスト問題に直面しており、回避策を見つけることができません。必要時にダウンキャストするには?

私は例を挙げて全体の文脈を提供しようとします:基本的に、私たちは2つのソフトウェアコンポーネントを持っており、BrickHigh、BrickLowとしましょう。 BrickLowはBrickHighからすべてを使用できますが、BrickHighはBricklowを見ることができません。 BrickHighで

AnimalクラスのDAOと(属性の数十)がある:

私は動物を拡張するCatクラス(aswellマップされていない属性の数十を)作成したBrickLowで
public class Animal .. { 
//attributes... 
} 

public class Cat extends Animal { 
//attributes 
} 

マップされた属性ごとにスーパークラス(Animal)を持つことを意図していました。しかし、アプリケーション全体でCatを使用しているので、変更が多すぎるため、私のアプリケーションでは動物クラスを使用できません。

しかし明らかに、私は、Javaが許可していないので、DAOから取得した後、私の動物を猫にキャストすることはできません。

私のBrickHighには私のBrickLowが見えないので、Animal animal = new Cat();可能。

私の最初のアイデアは、パラメータ

public Cat(Animal a) { 
super(a); 
} 

などの動物を取るだろう。しかし、私のコンストラクタは私の動物のクラスである必要がありますどのような猫でコンストラクタを作成することでしたか?それは動作していないようです。

+2

が、これは本当にあまり意味がありませんすべてのちょうどマンボジャンボです。あなたがNDAコードを掲載するのを避けようとしていることを理解していますが、ここであなたが現在持っているのは、説明が難しい単なる理論上の問題です。 – Shark

+2

「母クラス」のような独自のカスタム用語を使用し始めると本当に分かりにくいです(それはスーパークラスですよね?) –

+0

"BrickLowではCatクラスを作成しました"アプリ全体がCatを使用してから変更されます。 *全体的な*をしようとしていることのより良い説明が必要であり、確かに標準的なJava用語を使用することが役立つでしょう。あなたが「BrickLowで私はCatクラスを作成しました」と言うとき、それは内部的な意味ですか? – arcy

答えて

2

私のコンストラクタは、私のAnimalクラスに属している必要がありますか?それは動作していないようです。

このような何か:

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

しかし、私は、オブジェクトファクトリパターンを使用したほうが良いかもしれないと思います。つまり、Animalインスタンスを作成できるファクトリオブジェクトを使用するDAOクラスを使用します。 BrickLow APIを使用するコードでDAO(BrickHighから)を使用すると、AnimalインスタンスではなくCatインスタンスを生成するファクトリでifをインスタンス化します。

1

私はあなたの質問を完全に理解していませんが、BrickHighのコードの中からいくつかの動物クラスのインスタンスを作成したいが、BrickLowの知識がなくても、 DAOの1つ以上の属性によって識別されるClassオブジェクト例えば

public interface AnimalFactory { 
    boolean canInstanciate(AnimalDAO dao); 
    Animal instanciate(AnimalDAO dao); 
} 

あなたBrickHighは、工場のセットを持っているでしょうし、新工場を登録する機構を提供します。例えば

:はっきり* *問題を示し、具体的な例なし

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"); 
    } 
} 
関連する問題