Tôi là lập trình viên C# mới cho ngôn ngữ D. Tôi hơi bối rối với ngôn ngữ lập trình OOP trong D.Tại sao một chức năng với công cụ sửa đổi được bảo vệ có thể bị ghi đè và truy cập mọi nơi?
Giả sử rằng tôi có lớp sau đây:
public class A {
protected void foo() {
writefln("A.foo() called.");
}
};
public class B : A {
public override void foo() {
writefln("B.foo() called.");
}
};
Các modifier protected
có nghĩa là tôi có thể truy cập các phương pháp .foo()
chỉ trên lớp được thừa kế, vậy tại sao D chương trình này biên dịch bình thường?
Dưới đây là tương đương với 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();
}
};
Nó không biên dịch và đưa ra các thông báo lỗi sau (như tôi dự kiến):
Test.cs (10 , 30): lỗi CS0507:
B.foo()': cannot change access modifiers when overriding
bảo vệ 'thừa hưởng' thành viên A.foo()'
ai đó có thể giải thích hành vi D này? Cảm ơn trước.
Tại sao bạn nhầm lẫn? C# và D chỉ là các ngôn ngữ khác nhau, vì vậy chúng làm việc khác nhau. Thoạt nhìn, cả hai cách tiếp cận đều có ý nghĩa với tôi, do đó, nó phụ thuộc vào các nhà thiết kế ngôn ngữ để quyết định nên đi theo con đường nào. – svick
Humm, bởi vì tôi đã nhớ rằng các bộ điều khiển truy cập của một ngôn ngữ lập trình hướng đối tượng hoạt động theo cùng một cách. – Jack
downvotes- có thể giải thích xin vui lòng? – Jack