# C# in the Nutshell: Dziedziczenie
## Dziedziczenie
Dziedziczenie polega na tym, że klasa dziedzicząca posiada wszystkie właściwości i metody klasy, z której dziedziczy (za wyjątkiem specjalnie określonych).
```csharp=
class Enemy: Character
{
}
```
Powyższy zapis oznacza, że klasa `Enemy` dziedziczy od klasy `Character`.
## Słowo kluczowe `virtual`
Oznacza to, że kod szuka implementacji w klasie dziedziczącej, później w klasie bazowej.
```csharp=
public virtual Hit() {
}
```
Dla przykładu:
```csharp=
class Character
{
public virtual void Hit() { Console.WriteLine("Character hit()"); }
}
class Enemy : Character
{
public override void Hit() { Console.WriteLine("Enemy hit()"); }
}
// w funkcji main:
Character character = new Enemy();
character.Hit();
// na konsoli wyświetli się "Enemy hit"
```
## Słowo kluczowe `override`
```csharp=
class Enemy : Character
{
public override void Hit() { }
}
```
To słowo kluczowe oznacza, że metoda `Hit()` w klasie `Enemy` nadpisuje tak samo nazwaną metodę z klasy `Character`.
## Słowo kluczowe `out`
To słowo oznacza, że poza wartością zwracaną przez funkcję, możemy jeszcze zwrócić jakąś wartość poprzez dany parametr. \
Dla przykładu:
```csharp=
int selection;
while(!int.TryParse(Console.ReadLine(), out selection)){ }
Console.WriteLine(selection);
```
Powyższy kod oznacza, że funkcje `int.TryParse()` zwraca wartość nie tylko poprzez `return`, ale też poprzez parametr `selection`
#### `int.TryParse(Console.ReadLine(), out parametr)`
Ta funkcja "próbuje" przekształcić dane z konsoli na typ int i zwraca, czy jej się to udało. Ta funkcja występuje także dla typów innych niż int.
## Pętla `for`
```csharp=
for (int i = 0; i < aliveEnemies.Count; i++)
{
aliveEnemies[i].Introduce();
}
```
Powyższy fragment kodu można zapisać w równoważny sposób za pomocą pętli `while`:
```csharp=
int i = 0;
while(i < aliveEnemies.Count)
{
aliveEnemies[i].Introduce();
i++;
}
```
## Parametr opcjonalny
```csharp=
protected void Hit(bool isSpecialAbility = false)
{
}
```
Parametr `isSpecialAbility` jest parametrem opcjonalnym, co oznacza, że jeśli nie zostanie podany przy wywołaniu funkcji, to jego wartość zostanie ustawiona na domyślną, w tym wypadku false.
### Słowo kluczowe `protected`
To słowo kluczowe oznacza, że dana metoda/właściwość jest dostępna dla danej klasy i klas po niej dziedziczących, ale nie jest dostępna z zewnątrz (dla klas niedziedziczących zachowuje się tak samo jak `private`).
###### tags: `.Net PG` `C#` `dziedziczenie`