2017-07-06 1 views
0

Ich bin mit einem Downcast-Problem in meiner Unternehmenssoftware konfrontiert und es wird mir nicht gelingen, einen Workaround zu finden. (Es ist etwas an Ort und Stelle und ich kann das ganze Konzept nicht ändern)Wie kann man runterkommen, wenn es notwendig ist?

Ich werde versuchen, Ihnen den gesamten Zusammenhang mit einem Beispiel zu geben: Grundsätzlich haben wir 2 Software-Komponenten, sagen wir BrickHigh, BrickLow. BrickLow kann alles von BrickHigh verwenden, BrickHigh kann Bricklow jedoch nicht sehen.

In BrickHigh gibt es eine Tierklasse (Dutzende von Attributen) mit seinem DAO:

public class Animal .. { 
//attributes... 
} 

In Bricklow ich eine Cat-Klasse erstellt haben (Dutzende von nicht zugeordneten Attribute aswell), die Tier erstreckt.

public class Cat extends Animal { 
//attributes 
} 

Was beabsichtigt wurde, ist eine Superklasse (Animal) mit jedem zugeordneten Attribut zu haben. Aber ich kann meine Tierklasse nicht in meiner Anwendung verwenden, da es zu viele Änderungen geben würde, da die gesamte App Cat verwendet.

Aber natürlich, ich kann nicht mein Tier zu Cat, nachdem ich es von der DAO, da Java es nicht erlaubt, und ich brauche alle Informationen von Animal.

Da mein BrickHigh meinen BrickLow nicht sieht, gibt es keine solchen Dinge wie Animal animal = new Cat(); möglich.

Meine erste Idee war, einen Konstruktor in Cat zu erstellen, die

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

ein Tier als Parameter übernehmen würde, aber was mein Konstruktor in meiner Klasse Tieres sein muss? Es scheint nicht zu funktionieren.

+2

Ohne ein konkretes Beispiel, das deutlich * * veranschaulicht das Problem, das ist alles nur Hokuspokus, die wirklich nicht viel Sinn machen. Ich verstehe, dass Sie versuchen, den NDA-Code nicht zu veröffentlichen, aber was Sie derzeit hier haben, ist ein bloßes theoretisches Problem, das schwer zu erklären ist, mit feinen Details, die in der Übersetzung verloren gehen. – Shark

+2

es ist wirklich schwer zu verstehen, wenn Sie eigene Terminologie wie "Mutter Klasse" verwenden (es ist super Klasse, richtig?) –

+0

Es ist auch schwer zu lösen "In BrickLow habe ich eine Cat-Klasse erstellt" mit "es wäre zu viele Änderungen, da die gesamte App Cat "verwendet. Ich stimme zu, dass wir eine bessere Erklärung dessen benötigen, was Sie * insgesamt * tun möchten, und sicherlich würde die Verwendung von Java-Standardbegriffen helfen. Wenn du sagst "In BrickLow habe ich eine Cat-Klasse erstellt", meinst du, es ist intern? – arcy

Antwort

2

Aber was mein Konstruktor muss in meiner Tierklasse sein? Es scheint nicht zu funktionieren.

Etwas wie folgt aus:

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

Aber ich denke, besser sein kann, das Objekt Werksmuster verwendet; d. h., Ihre DAO-Klasse muss einen Parameter annehmen, der ein Factory-Objekt Objekt ist, das Animal Instanzen erstellen kann. Wenn Sie das DAO (von BrickHigh) in Code verwenden, der die BrickLow-APIs verwendet, instanziieren Sie mit einer Factory, die Cat Instanzen statt Animal Instanzen erzeugt.

1

Ich bin mir nicht sicher, ob ich Ihre Frage vollständig verstanden habe, aber wenn Sie eine Instanz einer Tierklasse aus dem Code von BrickHigh erstellen möchten, ohne jedoch BrickLow zu kennen, können Sie entweder eine Factory verwenden oder ein Klassenobjekt, das durch ein oder mehrere Attribute des DAO identifiziert werden würde.

Zum Beispiel:

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

Ihre BrickHigh würde dann eine Reihe von Fabriken, und würde einen Mechanismus zur Registrierung neuer Fabriken liefern.

Zum Beispiel:

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"); 
    } 
} 
Verwandte Themen