Jestem programistą C# nowym w języku D. Jestem trochę zmieszany z OOP w języku programowania D.Dlaczego funkcja z chronionym modyfikatorem może zostać nadpisana i dostępna w każdym miejscu?
Zakładając, że mam następujące klasy:
public class A {
protected void foo() {
writefln("A.foo() called.");
}
};
public class B : A {
public override void foo() {
writefln("B.foo() called.");
}
};
protected
modyfikator oznacza, że można uzyskać dostęp do metody .foo()
tylko na dziedziczonej klasy, więc dlaczego to D Program kompiluje normalnie?
Oto odpowiednik C# .NET:
using System;
public class A {
protected virtual void foo() {
Console.WriteLine("a.foo() called.");
}
};
public class B : A {
public override void foo() {
Console.WriteLine("b.foo() called.");
}
};
public class MainClass {
public static void Main(string[] args) {
A a = new A();
B b = new B();
a.foo();
b.foo();
}
};
To nie kompiluje i biorąc pod uwagę następujący komunikat o błędzie (zgodnie z oczekiwaniami):
test.cs (10 , 30): error CS0507:
B.foo()': cannot change access modifiers when overriding
chronione 'odziedziczone członkiem `A.foo()'
Może ktoś wyjaśnić to zachowanie D? Z góry dziękuję.
Dlaczego jesteś zdezorientowany? C# i D są po prostu różnymi językami, więc robią różne rzeczy. Na pierwszy rzut oka oba podejścia mają dla mnie jakiś sens, więc to projektanci języka decydują, którą drogę wybrać. – svick
Humm, ponieważ miałem na myśli to, że modyfikatory dostępu obiektowego języka programowania działały w ten sam sposób. – Jack
downvotes- potrafisz wyjaśnić? – Jack