# Statische Methoden in abstrakte Klassen deklarieren?



## sunnyfriday (17. Sep 2008)

Hallo Leute,

Habe eine Frage... wie kann ich eine statische Methode in eine abstrakte Klasse deklarieren? Geht das überhaupt??


Ich habe 3 Klassen. Type1, Type2, Type3.
Diese 3 Klassen MÜSSEN die Funktionen read(), write(), connect() implementieren. Die Implementierung ist für jeden Type verschieden. Daher habe ich diese Funktionen in eine abstrakte Klasse "Type" deklariert.

Die Methode connect() jedoch sollte aufrufbar sein auch ohne ein entsprechendes Objekt zu erzeugen.
Diese allerdings kann ich nicht als statische Methode deklarieren. 
Kennt jemand ne Lösung?
Ist in diesem Fall auch ein bestimmtes Entwurfsmuster zu empfehlen. Wenn ja, welches??
Habe mit Entwurfsmustern wenig Erfahrung. 

Gruß Tom


----------



## maki (17. Sep 2008)

Das Muster heisst Abstract Factory, und nein, eine Methode kann nicht abstract und static sein, beides geht nicht, wäre auch sinnfrei.


----------



## SlaterB (17. Sep 2008)

static != Vererbung,

wann immer du an Oberklassen/ Interface usw denkst, hat das nichts mit static zu tun,

du kannst aber eine einfache connect()-Methode per Vererbung handeln
und in bestimmten Klassen in diese Methode nur genau einen Aufruf einer statischen Methode schreiben,
falls das hilft,


----------



## Landei (17. Sep 2008)

> wie kann ich eine statische Methode in eine abstrakte Klasse deklarieren?



eine abstrakte Klasse kann ohne weiteres statische Methoden besitzen, aber du kannst sie nicht abstrakt machen (deklarieren ohne sie zu definieren)



> Die Methode connect() jedoch sollte aufrufbar sein auch ohne ein entsprechendes Objekt zu erzeugen.



Dann muss connect() statisch sein. Punkt.

Statische Methoden folgen nicht dem normalen Schema mit überschreiben und so, und können deshalb auch nicht abstrakt deklariert (sondern nur definiert) werden.


----------



## sunnyfriday (17. Sep 2008)

Hallo,
danke für die schnelle Antworten.
Zu SlaterB: Meinst du, ich soll einfach die Methode erben, und dann in der entsprechenden Klasse überschreiben???
Habs nicht wirklich verstanden ;-)



> du kannst aber eine einfache connect()-Methode per Vererbung handeln
> und in bestimmten Klassen in diese Methode nur genau einen Aufruf einer statischen Methode schreiben,
> falls das hilft,


----------



## SlaterB (17. Sep 2008)

> Meinst du, ich soll einfach die Methode erben, und dann in der entsprechenden Klasse überschreiben??? 

wie Methoden allgemein abstrakt definiert und dann überschrieben werden weißt du doch,
von read(), write() usw.

ich sage nur, dass du das genauso für connect() machen kannst,
und in den Unterklassen in den nun vererbten nichtstatischen connect()-Methoden jeweils irgendeine statische Methode aufrufst,

falls das hilft, worum es geht weiß ja niemand


----------



## sunnyfriday (17. Sep 2008)

Hallo,

Zu Landei:

Aber jeder Type muss die connect() Methode anders implementieren... Ich möchte halt nicht ein Object dieser Klassen erzeugen wenn ich nur die connect() Methode aufrufe.


----------



## sunnyfriday (17. Sep 2008)

zu SlaterB:

Dann muss ich ja ein Objekt dieser Klasse erzeugen. Genau das will ich doch nicht.


----------



## SlaterB (17. Sep 2008)

ist ja auch ok, dann mache es nicht,

du musst nur verstehen, dass du für statische Methoden keine Vererbung hast,

abstrakte Klasse Type, Unterklassen XType, YType

nun kannst du gerne XType.connect() oder YType.connect() aufrufen,
aber nicht Type.connect() und dann soll entweder XType oder YType gemeint sein,
nach welchem Schema sollte das passieren?

bei Objekten ist es klar:
Type t = new XType();
t.read();
dann kann sich ja jeder denken, wie Java intern herausfindet, dass read() von XType gemeint ist,

aber für Klassen gibt es ja kein derartiges Konstrukt,
du kannst nicht
Type = XType; schreiben oder so,


----------



## sunnyfriday (17. Sep 2008)

Hallo SlaterB,

Ich dachte mir ein solches Konstrukt:

1: Verbindung zu XType(Physical) über Klasse XType.connect(). Wenn XType.connect() erfolgreich, dann weiter mit 2 
2: Type type = new XType();
3. type.read() oder type.write();

Also. wenn XType.connect() nicht erfolgreich, dann brauche ich kein XType Objekt zu erzeugen.
Deswegen eine statische Methode.
Das mag vielleicht auch ne scheiß Lösung sein, aber da ich ein Anfänger bin dachte ich an so einer lösung.

gruß


----------



## SlaterB (17. Sep 2008)

also am Anfang ein XType.connect()-Aufruf, ok

aber wenn du direkt die Klasse XType angibst, wozu dann überhaupt über Vererbung nachdenken,
dann brauchst du die Methode gar nicht in Type 'irgendwie' definieren,

gut, man könnte sagen, dass Type vorschreiben soll, dass XType auch ja diese Methode implementiert,
aber das bringt hier doch wenig,

wenn sie nicht da ist, dann bekommst du beim Aufruf von XType.connect() direkt eine Fehlermeldung,

das andere ist ja Polymorphie,
unter Type type versteckt sich eine unbekannte Klasse, die bestimmte Methoden haben MUSS


----------



## sunnyfriday (17. Sep 2008)

Hallo SlaterB,

Das hört sich logisch an... Doch wie sage ich, dass XType die connect() haben MUSS?
Wie hättest du es gemacht??
Naja, ich will dich jetzt auch nicht weiter damit nerven...Ich werde dann wahrscheinlich doch immer ein Objekt erzeugen müssen.

Danke nochmals


----------



## SlaterB (17. Sep 2008)

> Doch wie sage ich, dass XType die connect() haben MUSS? 


wie gesagt ist das nicht möglich 
und eher auch nicht nötig, solange mit dem Aufruf XType.connect() im Quellcode direkt eine Rückmeldung kommt, falls die Methode fehlt


----------



## maki (17. Sep 2008)

sunnyfriday,

hast du dir nun die Abstract Factory angesehen, oder nicht?


----------



## SlaterB (17. Sep 2008)

ist das irgendwie relevant?


----------



## Landei (17. Sep 2008)

Das du keine Objekte instantiieren "darfst", deutet darauf hin, dass du in deiner Architektur ein Fehler hast. ich kann hier nur raten, was du eigentlich willst, aber es könnte sein, dass du sozusagen eine "parallele" Hierarchie für die connect() Methoden brauchst, also soetwas:


```
class A{}
class B{}

abstract class Connect() {
   abstract void connect();
   static Connect getConnect(Class clazz) {
      if (clazz == A.class) {
           return new ConnectA();
      } 
      if (clazz = B.class) {
           return new ConnectB();
      } 
   }
} 

class ConnectA extends Connect {
  void connect(){ /*do something */ }
}

class ConnectB extends Connect {
  void connect(){ /*do something */ }
}
```


----------



## maki (17. Sep 2008)

SlaterB hat gesagt.:
			
		

> ist das irgendwie relevant?


So wie sich das für mich anhört, ist es das was er sucht.


----------



## sunnyfriday (17. Sep 2008)

Hallo maki,

Hab das Abstract Factory nur mal kurz angeschaut. Muss es später mal genauer unter die Lupe nehmen.

Danke übrigens


----------

