Avatar billede js26 Nybegynder
28. december 2001 - 09:57 Der er 3 kommentarer

static implementation af abstract metode

Hvorfor kan jeg ikke lave en implementation af en abstract metode og gøre denne static?
Avatar billede logical Nybegynder
28. december 2001 - 10:32 #1
Fordi en statisk og en dynamisk metode er to forskellige ting.

En statisk metode kan kaldes uden nogen instanser af klassen, og behøver heller ikke at kende til en instans for at gøre nogle ting.

Abstraktion tilhører et kørende objekt. Der skal være vished for at et objekt har en given metode når den implementerer en abstrakt superklasse. Statiske og dynamiske objekter har 2 forskellige scopes, og den abstrakte implementering vil derfor ikke tilhøre objektet.

Eller kig på følgende scenario:
public abstract class x { public void yy(); }
public class y extends x{ public void yy() { ... } }
public class z extends y {}

For en instans af klassen z vil der altid være en garanti for at metoden yy er tilgængelig, også selv om z ikke implementerer den selv.

Hvis du har en static metode:
public class A { static void aa() { ... } }
public class B {}
Kan du ikke for en instans af klassen B kalde metoden aa(). Det kan ikke lade sig gøre.


Det er sådan lidt fundamentalt med hvordan ting skal virke, men lad mig spørge dig. Hvorfor vil du implementere en abstrakt metode i en static metode? Er der fordi du vil påtvinge at en subklasse har en given statisk metode?? For det vil være blandt de ting, som ikke er muligt, og der er andre mulige konstruktioner til at gøre den slags ting.
Avatar billede js26 Nybegynder
28. december 2001 - 10:53 #2
Ja, jeg vil gerne påtvinge subklassen en statisk metode.
Jeg skal have defineret en static variabel i en subclass som jeg skal bruge i 2 tilfælde.
I den ene situation ved jeg kun at det er en instans af superklassen og skal derfor referere til subklassens metode gennem superklassen.
I den anden situation har jeg ingen instans, men skal hente variablen gennem class member.
Nu har jeg løst det med en public static final variabel på subklassen og en inplementation af en abstract metode der returnerer denne variabel.
Har du et alternativt forslag?
Avatar billede logical Nybegynder
28. december 2001 - 11:04 #3
Vend det om og læg funktionaliteten i superklassen.

public abstract class Super {
  // Methods to implement
  public abstract void method1();
  public abstract void method2();


  private static Super _onlyInstance = null;

  public static Super getInstance() {
    if (_onlyInstance != null)
      return _onlyInstance;
    return createInstance(\"default\");
  }
  public static Super createInstance(String key) {
  if (_onlyInstance != null)
        throw new IllegalStateException(\"Instance already defined\");

  if (key.equals(\"Sub1\"))
    _onlyInstance = new Sub1();
  else if (key.equals(\"Sub2\"))
    _onlyInstance = new Sub2();
  else if (key.equals(\"default\"))
    _onlyInstance = new Sub1();

  return _onlyInstance();
  }
}


Så kan du tage fat i din sublasse ved at sige:
Super s = Super.getInstance();
s.method1();
eller
Super s = Super.createInstance(\"Sub2\");
s.method1();


Andre måder at hente en instans kunne så være forskellige lookup mekanismer, f.eks. vhja property filer og reflektion.

Men ved at starte ved superklassen, kan det lade sig gøre.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester