Tôi đang học C# và tôi gặp sự cố sau. Tôi có hai lớp: cơ sở và nguồn gốc:C# Ẩn, ghi đè và gọi hàm từ lớp cơ sở
class MyBase
{
public void MyMethod()
{
Console.WriteLine("MyBase::MyMethod()");
}
}
class MyDerived: MyBase
{
public void MyMethod()
{
Console.WriteLine("MyDerived::MyMethod()");
}
}
Còn bây giờ, mà không virtual
và override
từ khóa. Khi tôi biên dịch, tôi nhận được cảnh báo (dĩ nhiên là dự kiến) mà tôi cố gắng ẩn MyMethod
từ lớp MyBase
.
Điều tôi muốn làm là gọi phương thức từ lớp cơ sở có thể hiện của lớp dẫn xuất. Tôi làm như sau:
MyDerived myDerived = new MyDerived();
((MyBase)myDerived).MyMethod();
Nó hoạt động tốt khi tôi không chỉ định bất kỳ virtual
, v.v ... từ khóa trong phương pháp. Tôi đã cố gắng kết hợp các từ khóa và tôi nhận được các kết quả sau:
| MyBase::MyMethod | MyDerived::MyMethod | Result printed on the console |
| -----------------|---------------------|-------------------------------|
| - | - | MyBase::MyMethod() |
| - | new | MyBase::MyMethod() |
| virtual | new | MyBase::MyMethod() |
| virtual | override | MyDerived::MyMethod() |
Tôi hy vọng bảng này rõ ràng cho bạn. Tôi có hai câu hỏi:
- Đó có phải là cách chính xác để gọi hàm từ lớp cơ sở (
((MyBase)myDerived).MyMethod();
)? Tôi biết vềbase
từ khóa, nhưng nó có thể được gọi chỉ từ bên trong của lớp dẫn xuất. Đúng không? - Tại sao trong trường hợp cuối cùng (với
virtual
vàoverride
công cụ sửa đổi) phương thức được gọi đến từ lớp dẫn xuất? Bạn vui lòng giải thích điều đó không?
Bạn có thể vui lòng giải thích về những gì bạn muốn * chứ không phải những gì bạn đã trải nghiệm? Tất cả những gì tôi có thể nói ngay bây giờ là "Có, có vẻ đúng". Đối với câu hỏi cuối cùng, bạn thực sự nên đọc về cách thức hoạt động của phương thức ảo. Xem http://en.wikipedia.org/wiki/Virtual_method_table để biết thông tin. –