Granska principerna för klassarv
Arv är en av de främsta egenskaperna för objektorienterad programmering. Du kan skapa en hierarki med klasser genom att definiera relationer mellan klasser. I C# kan du skapa en basklass som definierar vanliga beteenden och egenskaper och sedan skapa härledda klasser som ärver och utökar det beteendet.
En basklass med namnet Person kan till exempel definiera egenskaper för Name och Age. En härledd klass med namnet Employee kan ärva dessa egenskaper och definiera andra egenskaper som EmployeeNumber och Salary.
Det här exemplet kan representeras med hjälp av följande C#-kod:
public class Person
{
public string? Name { get; set; }
public int Age { get; set; }
}
public class Employee : Person
{
public int EmployeeNumber { get; set; }
public decimal Salary { get; set; }
}
Det här kodexemplet definierar klassen Person och sedan klassen Employee. Observera kolontecknet (:) i Employee-klassdeklarationen. Kolonet (:) mellan Employee och Person anger att klassen Employee ärver från klassen Person. I det här fallet ärver klassen Employee egenskaperna Name och Age och definierar ytterligare två egenskaper: EmployeeNumber och Salary. När ett Employee objekt skapas har det åtkomst till egenskaperna Name och Age som definierats i klassen Person samt egenskaperna EmployeeNumber och Salary som definierats i klassen Employee. När ett Person objekt skapas har det bara åtkomst till egenskaperna Name och Age.
Med arv kan du skapa en hierarki med klasser som delar gemensamt beteende och egenskaper. Det gör att du kan återanvända kod och definiera relationer mellan klasser. Genom att använda arv kan du skapa mer underhållsbar och utökningsbar kod.
Fördelar med arv
Arv ger flera fördelar, bland annat:
- Återanvändning av kod: Med arv kan du återanvända kod som definierats i en basklass i en härledd klass. Detta minskar dupliceringen och främjar återanvändning av kod.
- Utökningsbarhet: Med arv kan du utöka beteendet för en basklass genom att lägga till nya medlemmar i en härledd klass. Du kan definiera nya egenskaper, metoder och händelser i en härledd klass.
- Inkapsling: Arv främjar inkapsling genom att låta dig dölja implementeringsinformationen för en basklass från en härledd klass. Med arv och inkapsling kan du definiera ett tydligt gränssnitt för interaktion med objekt i en härledd klass.
- Konsekvens: Arv främjar konsekvens genom att du kan definiera vanliga beteenden i en basklass. Ärv från en basklass säkerställer att de härledda klasserna har samma grundläggande beteende.
- Polymorfism: Arv möjliggör polymorfism, vilket gör att du kan behandla objekt av en härledd klass som objekt i basklassen. Med polymorfism kan du skriva kod som fungerar med objekt av olika typer utan att känna till deras specifika typ vid kompileringstiden.
Jämför klassarv med gränssnittsimplementering
C# innehåller två mekanismer för att definiera relationer mellan klasser: klassarv och gränssnittsimplementering. Med klassarv kan en klass ärva medlemmar från en basklass, medan gränssnittsimplementering gör att en klass kan implementera medlemmar som definierats i ett gränssnitt. Båda mekanismerna möjliggör återanvändning av kod och främjar polymorfism, men de har olika egenskaper:
Klassarv har följande egenskaper:
- En klass kan bara ärva från en basklass.
- En härledd klass kan återanvända, utöka och ändra det beteende som definierats i basklassen.
- Arv skapar en "is-a"-relation mellan klasser.
Gränssnittsimplementeringen har följande egenskaper:
- En klass kan implementera flera gränssnitt.
- En klass kan definiera sitt eget beteende och implementera de medlemmar som definierats i ett gränssnitt.
- Gränssnittsimplementering skapar en "kan-göra"-relation mellan klasser.
Skillnaden mellan "is-a" och "can-do"-relationer är viktig när du utformar objektorienterade system. I allmänhet bör du använda klassarv när en härledd klass är en specialiserad version av en basklass. Du bör använda gränssnittsimplementering när en klass kan utföra en specifik uppsättning åtgärder.
Ett exempel på när du ska använda klassarv är när du har en basklass med namnet Dog och härledda klasser med namnet German Shepherd och Golden Retriever.
German Shepherd och Golden Retriever är specialiserade versioner av en Dog. I det här fallet kan du använda klassarv för att definiera en gemensam uppsättning egenskaper och metoder i klassen Dog och sedan utöka och ändra beteendet i klasserna German Shepherd och Golden Retriever.
Ett exempel på när du ska använda gränssnittsimplementering är när du har ett gränssnitt med namnet IDrawable som definierar en Draw metod. Du kan implementera IDrawable-gränssnittet i klasser som kan ritas, till exempel Circle och Rectangle. I det här fallet kan du använda gränssnittsimplementering för att definiera en gemensam uppsättning åtgärder som delas av olika klasser.
Jämför klassarv med polymorfism
Klassarv och polymorfism är nära relaterade begrepp inom objektorienterad programmering. Med arv kan du definiera en hierarki med klasser som delar vanliga beteenden, medan polymorfism gör att du kan behandla objekt av en härledd klass som objekt i deras basklass.
Anta till exempel att en basklass med namnet HousePet och härledda klasser med namnet Dog och Cat. Klassen HousePet definierar en Speak metod som returnerar en sträng som representerar ljudet som husdjuret gör. Klassen Dog åsidosätter metoden Speak för att returnera "Woof", och klassen Cat åsidosätter Speak-metoden för att returnera "Meow". Du kan skapa ett HousePet objekt med namnet myPet av typen Dog eller Cat och anropa metoden Speak för att få rätt svar.
I det här exemplet definierar klassen HousePet ett vanligt Speak beteende som Dog och Cat klasser delar. Klasserna Dog och Cat åsidosätter metoden Speak för att anpassa beteendet. När du anropar metoden Speak på ett HousePet objekt som refererar till en av de härledda klasserna får du rätt svar baserat på objektets typ. Här är kodexemplet som visar det här konceptet:
HousePet myPet1 = new Dog(); // Create a HousePet object named myPet1 that's of type Dog
HousePet myPet2 = new Cat(); // Create a HousePet object named myPet2 that's of type Cat
Console.WriteLine(myPet1.Speak()); // Call the Speak method on myPet1
Console.WriteLine(myPet2.Speak()); // Call the Speak method on myPet2
// Output: Woof
// Meow
public class HousePet
{
public virtual string Speak()
{
return "Hello";
}
}
public class Dog : HousePet
{
public override string Speak()
{
return "Woof";
}
}
public class Cat : HousePet
{
public override string Speak()
{
return "Meow";
}
}
Med polymorfism kan du skriva kod som fungerar med objekt av olika typer utan att känna till deras specifika typ vid kompileringstiden. I det här exemplet uppnås polymorfism genom att skapa instanser av klassen HousePet som är av typen Dog eller Cat. Metoden Speak anropas för de HousePet objekten och lämpligt svar returneras baserat på typen av objekt, antingen "Woof" eller "Meow". I C# kan polymorfism uppnås med hjälp av antingen klassarv eller gränssnittsimplementering.
Sammanfattning
Arv är ett grundläggande begrepp i objektorienterad programmering som gör att du kan skapa en hierarki med klasser genom att definiera relationer mellan klasser. I C#kan du använda klassarv för att skapa en basklass som definierar vanliga beteenden och egenskaper och sedan skapa härledda klasser som ärver och utökar det beteendet. Arv ger flera fördelar, inklusive återanvändning av kod, utökningsbarhet, inkapsling, konsekvens och polymorfism. Genom att använda arv kan du skapa mer underhållsbar och utökningsbar kod.