C# Klasser arv
Begreppet Arv
För att förstå bättre vad man har för nytta av klasser så ska vi titta på ett exempel där man utnyttjar en redan
existerande klass(kallas oftast superklassen) och skapar nya klasser(kallas subklasser) där innehållet från
grundklassen utnyttjas. Vi behöver då inte kopiera allt från grundklassen och lägga samma kod i de nya
klasserna utan vi utnyttjar en finess som kallas arv. Det fungerar så att vi utnyttjar den existerande klassen och
det enda vi behöver göra är att lägga till eller förändra olika delar som kommer till/skiljer sig gentemot den
existerande klassen.
Vårt tidigare Elev-exempel nu utbyggt med arv
Vår klass Elev blir nu en superklass för det är den vi ska ärva ifrån.
class Elev
{
// här deklareras gömda (utanför objektet) variabler och metoder som "private"
private string namn;
private int points;
//klassvariabel
public static int antal = 0;
// här deklareras synliga (utanför objektet) variabler och metoder som "public"
public void skriv_in_data()
{
Console.Write(" Elevnamn: ");
namn = Console.ReadLine();
Console.Write(" Poäng: ");
points = int.Parse(Console.ReadLine());
}
public void skriv_ut_data()
{
Console.WriteLine("\nElevnnamn: " + namn + " Poäng: " + points);
}
public void increase_points(int x)
{
points += x;
}
private void antalElever()
{
antal++;
}
public void skrivUtNamnOchAntalElever()
{
Console.WriteLine("========================");
Console.WriteLine(" Namn: " + namn);
Console.WriteLine(" Antal elever: " + antal + " st");
Console.WriteLine("========================");
}
//klassmetod
public static void skrivUtAntalElever()
{
Console.WriteLine("========================");
Console.WriteLine(" Antal elever: " + antal + " st");
Console.WriteLine("========================");
}
// Konstruktorer
public Elev()
{
antal++;
namn = "ingen";
points = 0;
}
public Elev(string n)
{
antalElever();
namn = n;
points = 0;
}
public Elev(string n, int p)
{
antalElever();
namn = n;
points = p;
}
}
Den första subklassen blir klassen VanligElev. Den blir trevligt kort att skriva nu när vi ärver en massa från klassen Elev.
Vi måste tala om vilken klass vi ärver från " : Elev " och så hänvisar vi till delar i den med "base".
class VanligElev : Elev {
int skapNr;
// Konstruktor 1
public VanligElev() : base ( ) {
skapNr=0;
}
// Konstruktor 2
public VanligElev(string fnamn, int p, int snr) : base (fnamn, p)
{
skapNr=snr;
}
// Metoden skriver ut informationen om den vanliga eleven.
public void skriv_ut_data_vanlig()
{
string info;
base.skriv_ut_data( );
info = "Elevens skåpnummer : " + skapNr +
"\nEleven är elev på vanliga gymnasiet.";
Console.WriteLine(info);
}
}
class DistansElev : Elev {
string handledare;
// Konstruktor 1
public DistansElev() : base( )
{
handledare = "NoName";
}
// Konstruktor 2
public DistansElev(string fnamn, string hnamn) : base (fnamn)
{
handledare=hnamn;
}
// Konstruktor 3
public DistansElev(String fnamn, int p, string handl):base (fnamn,p)
{
handledare = handl;
}
// Metoden skriver ut informationen om distanseleven.
public void skriv_ut_data_distans()
{
string info;
base.skriv_ut_data();
info = "Handledaren heter : " + handledare +
"\nEleven är en distanselev.";
Console.WriteLine(info);
}
} // end class DistansElev
Till slut huvudprogrammet som testar att skapa lite olika typer av objekt.
// HUVUDPROGRAMMET
class Program
{
static void Main(string[] args)
{
VanligElev student1 = new VanligElev("Janne Långben",123, 207);
VanligElev student2 = new VanligElev();
DistansElev student3 = new DistansElev("Musse Pigg","Fantomen");
DistansElev student4 = new DistansElev();
DistansElev student5 = new DistansElev("Kalle Anka", 111, "Fantomen");
Elev student6 = new Elev();
// Skriver ut information om studenterna.
student1.skriv_ut_data_vanlig();
student2.skriv_ut_data_vanlig();
student3.skriv_ut_data_distans();
student4.skriv_ut_data_distans();
student5.skriv_ut_data_distans();
student6.skriv_ut_data();
Console.ReadLine();
}
}
Källor
Skarp programmering med C#, 2011, Jan Skansholm