Warum eine Funktion mit geschützten modifier außer Kraft gesetzt werden können und zugänglich sind alle wo?

Ich bin C# - Programmierer, der neu D Sprache. Ich bin ein bisschen verwirrt mit OOP in D programming language.

Davon aus, dass ich die folgende Klasse:

public class A {
   protected void foo() {
      writefln("A.foo() called.");
   }
};

public class B : A {
   public override void foo() {
      writefln("B.foo() called.");
   }
};

Den protected Modifikator bedeutet, dass ich Zugriff auf die .foo() Methode nur auf vererbte Klasse,warum also dieser D Programm kompiliert normalerweise?

Hier ist das äquivalent zu 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();
   }
};

Es nicht kompiliert werden, und die folgende Fehlermeldung(wie von mir erwartet):

test.cs(10,30): Fehler CS0507: B.foo()': cannot change access
modifiers when overriding
geschützten "vererbten member" A. foo()'

Kann sich das jemand erklären D Verhalten? Vielen Dank im Voraus.

  • Warum sind Sie verwirrt? C# und D sind nur verschiedene Sprachen, so dass Sie die Dinge anders. Auf den ersten Blick, beide Ansätze machen einige Sinn für mich, so ist es die Sprache, die Designer, um zu entscheiden, welchen Weg zu gehen.
  • Humm,denn ich hatte im Hinterkopf, dass die Zugriffs-Modifizierer einer Objekt-orientierten Programmiersprache betrieben in der gleichen Weise.
  • downvotes - können erklären, bitte?
  • Und Sie tun das Gegenteil in C# finden Sie unter msdn.microsoft.com/en-us/library/aa288461%28v=vs.71%29.aspx ; also public/protected auf private. interface I { void foo(); } class A { virtual public void foo() {} } class B : A, I { void I. foo() {} }
  • Sie sind sicherlich nicht arbeiten auf die gleiche Weise. Zum Beispiel, C++ nicht haben internal und C# nicht friend. Oder Python, die haben nicht zugriffsmodifizierer an alle. Es gibt keinen standard, was zugriffsmodifizierer sollte eine Objekt-orientierte Sprache haben. Jede Sprache ist einfach anders.
  • C# hat eine Menge von Einschränkungen, die dazu bestimmt sind, um Fehler zu reduzieren. "denn ich hatte im Hinterkopf, dass die Zugriffs-Modifizierer einer Objekt-orientierten Programmiersprache wird in der gleichen Art und Weise" -- Das macht die Frage nicht beantworten. Warum haben Sie das im Hinterkopf? Es gibt keine rationale Grundlage für einen solchen glauben.

InformationsquelleAutor Jack | 2012-05-05
Schreibe einen Kommentar