Klasy abstrakcyjne

 

Klasa abstrakcyjna - oznaczona słowem kluczowym abstract to klasa, w której występuje jedna lub więcej metod abstrakcyjnych - również oznaczonych słowem kluczowym abstract. Metoda abstrakcyjna jest tylko zadeklarowana i nie ma implementacji.

Nie można utworzyć bezpośrednio obiektu klasy abstrakcyjnej. Klasa abstrakcyjna może być jedynie odziedziczona. W klasie potomnej muszą być zaimplementowane wszystkie abstrakcyjne metody zadeklarowane w nadrzędnej klasie abstrakcyjnej, albo klasa potomna również musi być oznaczona jako abstrakcyjna. Czyli w abstrakcyjnej klasie dziedziczącej (potomnej) mogą nie występować żadne metody abstrakcyjne - wystarczy, że dana klasa dziedzicząca od nadklasy abstrakcyjnej nie implementuje zadeklarowanej abstrakcyjnej metody, wówczas klasa ta również jest abstrakcyjna, mimo że nie zawiera jawnej deklaracji żadnej abstrakcyjnej metody.

W klasie abstrakcyjnej mogą występować dowolne atrybuty i metody z implementacją (metody nie-abstrakcyjne).

W klasie abstrakcyjnej mogą występować statyczne atrybuty i statyczne metody.

Klasa abstrakcyjna, w której występują wyłącznie metody abstrakcyjne powinna być zadeklarowana jako interfejs (patrz Interfejsy), a nie jako klasa abstrakcyjna.

Klasa abstrakcyjna może implementować interfejsy, wówczas nie musi zawierać implementacji wszystkich metod zadeklarowanych w implementowanych interfejsach.

Uwaga:

...natomiast klasa nie abstrakcyjna, która implementuje interfejs MUSI implementować wszystkie metody danego interfejsu.

Odpowiadający temu diagramowi kod w języku Java:

abstract class Animal {
	abstract void move();	// metoda abstrakcyjna - w przypadku różnych zwierząt będzie różnie realizowana
}


class Bird extends Animal {
    void fly() {
        // Tutaj jest implementacja procesu poruszania się przy użyciu lotu
    }

    void move() {    // implementacja metody move() zadeklarowanej w nadrzędnej klasie abstrakcyjnej
        fly();
    }    
} 


class Mammal extends Animal {
    void walk() {
        // Tutaj jest implementacja procesu chodzenia
    }

    void move() {     // implementacja metody move() zadeklarowanej w nadrzędnej klasie abstrakcyjnej
        walk();
    }    
} 

 

 

Drugi przykład klasy abstrakcyjnej

Ta sama sytuacja przedstawiona przy użyciu kodu w języku Java:

abstract class PojazdSilnikowy {
    float mocSilnika;   // pole-atrybut wspólny dla wszystich pojazdów silnikowych
    int maxLiczbaObrotówNaMinutę;    // pole-atrybut wspólny dla wszystich pojazdów silnikowych

     abstract void ustawObrotySilnika( int liczbaObrotówNaMinutę ) {     
           // metoda wspólna dla wszystkich pojazdów silnikowych 
           // ALE TUTAJ ABSTRAKCYJNA - pusta - bez implementacji, ponieważ dla każdego typu pojazdu silnikowego 
           // ustawienie określonych obrotów silnika będzie realizowane w zupełnie inny sposób
     }
}
class PojazdSpalinowy extends PojazdSilnikowy {
    // obiekt klasy PojazdSpalinowy jest jednocześnie obiektem klasy PojazdSilnikowy, 
    // czyli posiada wszystkie atrybuty i metody klasy PojazdSilnikowy
    // i dodatkowo atrybuty i metody zdefiniowane tutaj:

    int typPaliwa;   // cecha - atrybut typowy wyłącznie dla pojazdów spalinowych
    float pojemnośćZbiornikaPaliwa;     // cecha - atrybut typowy wyłącznie dla pojazdów spalinowych

    void zatankujPaliwo( ) {    // funkcja - metoda typowa wyłącznie dla pojazdów spalinowych
           [...implementacja metody...]
    }

    public void ustawObrotySilnika( int liczbaObrotówNaMinutę ) { 
           // Tutaj musi być implementacja tej metody, ponieważ jest ona zadeklarowana 
           // w macierzystej klasie abstrakcyjnej abstract class PojazdSilnikowy
           [...implementacja metody...]
    }
}
class PojazdElektryczny extends PojazdSilnikowy {
      // obiekt klasy PojazdElektryczny jest jednocześnie obiektem klasy PojazdSilnikowy,
      // czyli posiada wszystkie atrybuty i metody klasy PojazdSilnikowy
      // i dodatkowo atrybuty i metody zdefiniowane tutaj:

      float pojemnośćAkumulatorów; // cecha - atrybut typowy wyłącznie dla pojazdów elektrycznych

      void naładujAkumulatory( ) {    // funkcja - metoda typowa wyłącznie dla pojazdów elektrycznych 
           [...implementacja metody...]
      }

      public void ustawObrotySilnika( int liczbaObrotówNaMinutę ) { 
           // Tutaj musi być implementacja tej metody, ponieważ jest ona zadeklarowana 
           // w macierzystej klasie abstrakcyjnej abstract class PojazdSilnikowy
           [...implementacja metody...]
      }
}