Anzeige:
Ergebnis 1 bis 5 von 5

Thema: 'abstract static' geht nicht = alternativen ?

  1. #1
    Registrierter Benutzer
    Registriert seit
    26.10.2005
    Beiträge
    41

    Question 'abstract static' geht nicht = alternativen ?

    Hallo,

    ich habe mal eine Design Frage an euch:

    Ich habe 2 Klasse:
    Klasse A
    Code:
    public class Class_A{
      public static void doCalculate(){
         doSomething..;
      }
      public static void doManipulate(){
         doSomethingOther..;
      }
    }
    und Klasse B
    Code:
    public class Class_B{
      public static void doCalculate(){
         doSomething..;
      }
      public static void doManipulate(){
         doSomethingOtherThenA..;
      }
    }
    Zur Beschreibung: Beide haben die selben static Methoden, aber nur in der ersten machen sie das selbe(doSomething).
    Die 2.Methode wird zwar gleich aufgerufen, macht aber was anderes.

    Um den Code von der ersten Methode nicht jedesmal zu wiederholen, schreit es ja förmlich nach einer abstrakten Klasse von der die beiden dann erben um die 2 MEthode individuell zu implementieren:
    Code:
    public abstract class AbstractClass{
      public static void doCalculate(){
         doSomething..;
      }
      public abstract static void doManipulate();
      }
    }
    In der Theorie ganz schön, musste ich feststellen, das Java kein 'abstract static' unterstüzt.
    Begründung: static-Methoden gelten implizit als final und können von daher nicht überschrieben werden.
    Mit einem Interface ist das natürlich auch nicht handzuhaben(ähnliches Problem).

    Ich wollte euch jetzt mal fragen, ob einer von euch auch dieses Problem schon gehabt hat.

    Gibt es entwürfe wie man dieses handhaben kann?

    Vielen dank schonmal im vorraus
    Michael
    Geändert von michael.becker (10-01-2007 um 13:57 Uhr) Grund: Fehlerkorrektur

  2. #2
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Ich würde Klasse A und B jeweils von der AbstractClass ableiten und bei beiden Klassen noch ein Interface dazu implementieren.

    Mom ich werd mal kurz ein Mini-Beispiel schreiben.
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  3. #3
    Registrierter Benutzer
    Registriert seit
    26.10.2005
    Beiträge
    41
    Vielen dank für die schnelle Antwort.

    Aber auch in einem Interface ist das Problem, das es kein Static haben darf!

    also
    Code:
    public interface ClassInterface {
        public static void doManipulate();
    }
    geht auch nicht.
    Geändert von michael.becker (10-01-2007 um 14:00 Uhr) Grund: Fehlerkorrektur

  4. #4
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Da hab ich mal wieder nicht aufgepasst, du hast es aber schon im ersten Post erwähnt, genau das geht eben nicht, da Methodenköpfe in Interfaces nicht static sein können, sondern nur Variablen.

    Du müsstest also von einer abstrakten Klasse erben:

    Code:
    	public static void doSomething() {
    		System.out.println("doSomething");
    	}
    	
    	public static void doManipulate() {}
    Und doManipulate überschreiben. Allerdings kompiliert er auch noch, wenn du doManipulate nicht in Class A implementierst. Du könntest allerdings deine abstrakte Klasse so erweitern:

    Code:
    public abstract class AbstractClass {
    	public static void doSomething() {
    		System.out.println("doSomething");
    	}
    	
    	public static void doManipulate() throws NotYetImplementedException{
     throw new NotYetImplementedException("Error"); }
    }
    Und ClassA würde dann so aussehen:
    Code:
    public class ClassA extends AbstractClass {
    	public static void doManipulate() {
    		System.out.println("doSomthingOther A");
    	}
    }
    Wenn du nun ClassA.doManipulate() aufrufst und es ist nicht implementiert, musst du zumindest wissentlich eine Exception abfangen, was ja auch ein Hinweis ist, das noch was in ClassA zu tun ist. Zur Laufzeit wird dir der Fehler dann ohnehin klar.

    Vielleicht geht sowas mit Templates? Mit denen kenn ich mich aber nicht so gut aus.

    mfg, Christian

    PS: IllegalAccessExceptions sind für solche Fälle auch beliebt.
    Geändert von Waxolunist (10-01-2007 um 14:06 Uhr)
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  5. #5
    Registrierter Benutzer
    Registriert seit
    26.10.2005
    Beiträge
    41
    Naja nicht die schönste Variante, aber immerhin funktioniert es. Ich danke dir

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •