C# mahdollistaa erityisten abstraktien luokkien teon, joiden ominaisuudet ja toiminnot ovat käytettävissä ainoastaan ko.luokan perityissä aliluokissa. Näistä abstrakteista luokista ei voi tehdä instanssia suoraan. Nämä "abstraktit luokat" on määritelty ns. "uninstantiable"-tilaan eli niistä ei voi tehdä olioita new-operaattorilla ja konstruktorikutsulla. Abstrakteja luokkia on tarkoitus on käyttää vain varsinaisten luokkien kantaluokkana, eli nisitä periytetään luokkia, joista luodaan sitten olioita. Vertaus reaalielämään: "auto ja moottoripyörä ovat ajoneuvoja, mutta ajoneuvo itsessään ei ole mikään esine."
public abstract class Ajoneuvo
{
}
public class Auto : Ajoneuvo
{
}
Ajoneuvo ajo1 = new Ajoneuvo(); // virhe, abstraktista luokasta ei voi tehdä olioita
Ajoneuvo ajo2 = new Auto(); // ok
Luokat näyttävät määrittelyiltään tavallisilta luokilta, mutta luokkamäärittelyn yhdeyssä on käytetty abstract-avainsanaa. Nämä abstraktit luokat voivat sisältää ominaisuuksia, konstruktoreita ja toimintoja, kuten normaalit luokat. Luokan sisällä täytyy kuitenkin olla ainakin yksi metodi, jonka toteutus on jätetty toteuttamatta ja metodin esittelyn yhteydessä on käytetty abstract-avainsanaa. Tämä/nämä abstraktit metodit täytyy olla toteutettuna aliluokassa. Huomaa että sinun tulee käyttää override-määrettä kun toteutat perityssä luokassa ominaisuutta tai metodia. Abstrakti-luokka tavallaan "pakottaa" siitä perityn aliluokan toteuttamaan jonkin tietyn tehtävän eli metodin.
Luokan abstraktit jäsenet (siis esimerkiksi ominaisuudet ja metodit) ovat sellaisia, että niillä ei ole toteutusta, vaan se on toteutettava perivässä luokassa.
public abstract class Ajoneuvo
{
// abstrakti ominaisuus
public abstract int Huippunopeus { get; }
// abstrakti metodi
public abstract string Kiihdyta();
}
public class Auto : Ajoneuvo
{
private int huippunopeus;
// abstraktin ominaisuuden toteutus
public override int Huippunopeus
{
get {return huippunopeus;}
}
// abstraktin metodin toteutus
public override string Kiihdyta()
{
huippunopeus += 10;
return "Auto kiihdyttää, nopeus on " + huippunopeus;
}
}
Tutkitaan asiaa toisenkin esimerkin valossa. Tehdään abstrakti DrawingObject-luokka, jolla on abstrakti Draw()-metodi.
Yllä olevasta DrawingObject-luokasta ei voi tehdä oliota, koska luokka on määritelty abstraktiksi. Luokka toimii tällöin kantaluokkana ja pakottaa perivänluokan toteuttamaan ko. Draw()-metodin.
Toteutetaan Circle-luokka, joka periytyy yllä olevasta DrawingObject-luokasta ja toteuttaa Draw()-metodin.
Voimme toteuttaa myös Square-luokan, joka periytyy yllä olevasta DrawingObject-luokasta ja toteuttaa Draw()-metodin.
Tämän jälkeen Circle- ja Square-luokka voidaan käyttää seuraavasti:
Lisätietoa:
Abstract and Sealed Classes and Class Members (C# Programming Guide)
Interfaces (C# Programming Guide)