Ostatnio dlangowałem w Dlang, ponieważ C++ po prostu nie pasowało do mnie po tak długim użyciu Pythona. Podczas omszania natknąłem się na to, co uważam za bardzo proste ćwiczenie polimorfizmu. Przypuszczam, że spodziewałbyś się, że coś zadziała, a to, co faktycznie robi, to dwie zupełnie różne rzeczy z powodów, których użytkownik końcowy prawdopodobnie nie jest w stanie pojąć. Mając na uwadze powyższe, tutaj jest kod źródłowy mojego „sandbox.D”:Dlaczego ta metoda podklasy nie jest polimorficzna?
import std.stdio;
class Animal {
string voice = "--silence--";
void speak() {
writeln(this.voice);
}
}
class Dog : Animal {
string voice = "Whoof!";
}
int main() {
auto a = new Animal();
auto d = new Dog();
writeln(a.voice); // Prints "--silence--"
writeln(d.voice); // Prints "Whoof!"
a.speak(); // Prints "--silence--"
d.speak(); // Prints "--silence--" NOT "Whoof!"
return 0;
}
Chyba mój problem jest, dlaczego „to” słowo kluczowe po prostu nie wydają się być działa jak można oczekiwać, że w język następcy C++.
Ah, doceniam taką szybką reakcję! Zastanawiałem się, czy usunąć niektóre słowa kluczowe "auto". Ostatecznie, wypróbowałem to bez auto i zadeklarowałem właściwe typy, ale to nie miało znaczenia. Sądzę, że dziedziczenie obiektowe nie wydaje się tak przydatne, jak sobie wyobrażałem :( –
Przydaje się, po prostu pamiętaj, że tylko metody są nadpisywalne, zmienne nie. (Nie jestem pewien, czy to samo w Python, ale generalnie działa w ten sposób w wielu językach OOP), choć dziedziczenie ma swoje ograniczenia, możesz rozwiązać wiele rzeczy za jego pomocą, ale nie zawsze jest to najlepszy sposób: –
Jest bardzo przydatny. Musisz tylko zrozumieć, jak go używać, i źle rozumiesz, jak to działa.Trzeba tylko zastąpić funkcję zamiast zmiennej członkowskiej, i działa dobrze.Kod długość nie jest nawet bardzo różne.I jeśli chcesz zastąpić zmienną składową, po prostu zapakuj ją w funkcję, aby zwrócić jej wartość i użyj funkcji zamiast bezpośrednio używać zmiennej.Ale nigdy nie słyszałem o języku, który przeładowałby zmienne i biorąc pod uwagę sposób działania polimorfizmu pod maską, oznaczałoby to w zasadzie wrappi I tak w funkcjach pod maską. –