Podstawowa składnia dziedziczenia (:)
Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 19 z 70.
Dziedziczenie pozwala klasie przejąć właściwości i metody innej klasy. Zamiast pisać ten sam kod od nowa, tworzysz klasę bazową (rodzica) ze wspólną funkcjonalnością, a następnie tworzysz klasy pochodne (dzieci), które po niej dziedziczą.
W języku C# używasz symbolu dwukropka :, aby wskazać dziedziczenie:
public class Animal
{
public string Name { get; set; }
public void Eat()
{
Console.WriteLine($"{Name} is eating.");
}
}
public class Dog : Animal
{
public void Bark()
{
Console.WriteLine($"{Name} says Woof!");
}
}Klasa Dog dziedziczy wszystko z klasy Animal. Ma dostęp do właściwości Name i metody Eat() bez konieczności ponownego ich deklarowania, a ponadto dodaje własną metodę Bark():
Dog myDog = new Dog();
myDog.Name = "Buddy";
myDog.Eat(); // Wynik: Buddy je.
myDog.Bark(); // Wynik: Buddy mówi Woof!C# obsługuje tylko dziedziczenie pojedyncze, co oznacza, że klasa może dziedziczyć tylko po jednej klasie bazowej. Możesz jednak tworzyć łańcuchy dziedziczenia, w których klasa pochodna staje się klasą bazową dla innej klasy. W ten sposób powstaje hierarchia, która odwzorowuje relacje ze świata rzeczywistego, a jednocześnie pomaga utrzymać porządek w kodzie i umożliwia jego ponowne wykorzystanie.
Wyzwanie
ŁatwyZbudujmy hierarchię pojazdów, która pokazuje, jak dziedziczenie pozwala klasom pochodnym współdzielić funkcjonalność klasy bazowej, a jednocześnie dodawać własne, unikalne zachowania.
Utworzysz trzy pliki, aby uporządkować swój kod:
Vehicle.cs: Zdefiniuj klasęVehiclew przestrzeni nazwTransport. Będzie to klasa bazowa wspólna dla wszystkich pojazdów. Powinna mieć właściwośćBrand(string) i właściwośćYear(int), a także metodęStartEngine(), która wypisuje"{Brand} engine started."Car.cs: Zdefiniuj klasęCarw przestrzeni nazwTransport, która dziedziczy po klasieVehicle. Klasa samochodu dodaje własną właściwośćNumberOfDoors(int) i metodęHonk(), która wypisuje"{Brand} goes Beep Beep!"Program.cs: W głównym pliku utwórz instancję klasyCar, używając wartości wejściowych. Ustaw jej właściwości (w tym odziedziczone), a następnie pokaż, że samochód może używać zarówno własnych metod, jak i metod odziedziczonych z klasyVehicle.
Otrzymasz trzy dane wejściowe:
- Markę
- Rok
- Liczbę drzwi
Wypisz informacje o samochodzie i pokaż jego możliwości w tym formacie:
Car: {Brand} ({Year})
Doors: {NumberOfDoors}
{StartEngine output}
{Honk output}Na przykład, jeśli danymi wejściowymi są Toyota, 2022 i 4, wynik powinien być następujący:
Car: Toyota (2022)
Doors: 4
Toyota engine started.
Toyota goes Beep Beep!Zwróć uwagę, że obiekt Car może uzyskać dostęp do właściwości Brand i metody StartEngine(), mimo że są one zdefiniowane w klasie Vehicle. Na tym polega siła dziedziczenia — klasa pochodna automatycznie otrzymuje wszystko z klasy bazowej!
Spróbuj swoich sił
using System;
using Transport;
class Program
{
public static void Main(string[] args)
{
// Odczytaj dane wejściowe
string brand = Console.ReadLine();
int year = Convert.ToInt32(Console.ReadLine());
int doors = Convert.ToInt32(Console.ReadLine());
// TODO: Utwórz instancję Car
// TODO: Ustaw właściwości samochodu (Brand, Year, NumberOfDoors)
// TODO: Wypisz informacje o samochodzie w wymaganym formacie:
// Samochód: {Brand} ({Year})
// Drzwi: {NumberOfDoors}
// Następnie wywołaj StartEngine() i Honk()
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrznePrzestrzenie nazw i dyrektywyWprowadzenie do klas i obiektówSłowo kluczowe „this”Metody i parametryPola a właściwościKonstruktoryInicjalizatory obiektówPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawowa składnia dziedziczenia (:)Słowo kluczowe 'base'Słowa kluczowe virtual i overrideKlasy sealedBazowa klasa 'object'Powtórzenie – hierarchia pracowników7Zaawansowane funkcje
Przeciążanie operatorówIndeksery (this[])Nadpisywanie ToString()Metody rozszerzającePodsumowanie – własna lista2Właściwości i składowe statyczne
Właściwości automatyczneWłaściwości tylko do odczytu i zapisuPola i metody statyczneKlasy statyczneSkładowe z ciałem wyrażeniowym5Polimorfizm i interfejsy
Polimorfizm czasu kompilacji a czasu wykonaniaInterfejs a klasa abstrakcyjnaWiele interfejsówJawne implementowanie interfejsówRzutowanie w górę i w dółPowtórka — kalkulator kształtów8Zaawansowane koncepcje OOP
Kompozycja zamiast dziedziczeniaTypy generyczne (klasy i metody)Delegaty i zdarzeniaAtrybuty i refleksjaIDisposable i instrukcja usingPodstawy wstrzykiwania zależności11Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu3Architektura klas
Dane instancji a dane statyczneSłowa kluczowe 'readonly' i 'const'Pola zapasowePowtórzenie — menedżer kont bankowych6Hermetyzacja
Modyfikatory dostępuWłaściwości w hermetyzacjiImplementacja ukrywania danychWzorce niezmiennościPowtórka — dane studentów9Argumenty zmiennej liczby
Słowo kluczowe „params”Parametry opcjonalneArgumenty nazwanePrzeciążanie metodPoćwicz samodzielnie: Kompilator C# online