Dziedziczenie i dostęp do prywatnych pól klasy bazowej

0

Wiele razy czytałem że pola private są dostępne jedynie wewnątrz klasy w której się znajdują. Wydawało mi się to dziwne bo po co w takim razie te pola byłyby dziedziczone.

Na stronie Microsoft znalazłem coś takiego:

A derived class has access to the public, protected, internal, and protected internal members of a base class. Even though a derived class inherits the private members of a base class, it cannot access those members. However, all those private members are still present in the derived class and can do the same work they would do in the base class itself. For example, suppose that a protected base class method accesses a private field. That field has to be present in the derived class for the inherited base class method to work correctly.

Jeśli dobrze rozumiem to klasa potomna może mieć dostęp nawet do prywatnych pól klasy bazowej jeżeli odziedziczy odpowiednie metody?

1

Możesz mieć np. setter, który sprawdza zakres wprowadzanej wartości (a przy użyciu pola bezpośrednio możesz np. przekroczyć dopuszczalny zakres akceptowalnej temperatury i wysadzić pół fabryki - tylko dlatego, że pole było public ;))

Więc tak - przy odziedziczeniu metod i dostępie do metod, które mogą modyfikować wartości pól - klasa pochodna może ich używać.

2

W sumie ten cytat Microsoftu wszystko wyjaśnia, ale żeby to opisać innymi słowami.

Klasa pochodna dziedziczy wszystko, ale nie ma bezpośredniego dostępu do prywatnych pól. Co by było gdyby te prywatne pola nie były dziedziczone? A jeśli masz jakieś dziedziczone metody protected, które modyfikują te dane prywatne, to co one będą modyfikować w klasie pochodnej?
To trochę jakbyś dostał w prezencie samochód, który nie ma silnika. Mimo że masz cały interfejs (kierownica, sprzęgło, pedały), jak niby ten samochód ma jeździć?

1

Nie do końca. Dziedziczenie to inaczej rozszerzanie klasy bazowej. Jeśli klasa bazowa ma jakieś prywatne metody i pola, które są konieczne do jej działania, to klasa dziedzicząca też je posiada... tylko są one niejawne. :)

Np w C# jest klasa Exception. Możesz napisać klasę własnego wyjątku MyException, który dziedziczy po klasie Exception.

public class MyException: Exception
{
   
}

Ta klasa będzie działała jak klasa bazowa, pomimo tego, że jest pusta. Właśnie dlatego, że ona już z racji dziedziczenia, zawiera wszystkie mechanizmy potrzebne do jej działania. Nie możesz wywołać tych mechanizmów jawnie w klasie MyException, chyba że są protected, public albo internal czy protected internal (nie pamiętam dokładnie).

1 użytkowników online, w tym zalogowanych: 0, gości: 1