2011-01-12 28 views
5

Bởi vì tôi có nghĩa là, có thể đánh dấu một phương pháp ảo trong C# là cuối cùng vì vậy không có loại nào khác xuất phát từ loại này, có thể ghi đè lên nó một lần nữa?Có thể hoàn thành một phương pháp ảo trong C# không?

+0

Hết sức tò mò, trường hợp sử dụng của bạn là gì? Đây là một tính năng khá hiếm khi được sử dụng. Kịch bản bạn đã có nơi có ý nghĩa gì để phong ấn * phương pháp * nhưng không phải là * class *? –

+0

@Eric: Thực ra tôi không có bất kỳ trường hợp sử dụng nào: O Nhưng chuyện gì đã xảy ra ở đây. Tôi đang sử dụng thư viện .NET của bên thứ ba chưa ra. Thư viện này có rất nhiều loại nơi họ chỉ có các nhà xây dựng nội bộ. Tôi muốn làm cho các loại của riêng tôi xuất phát từ những điều này, nhưng theo cách của nó, nó không thể bởi vì các nhà thầu phải được công khai. Tôi yêu cầu họ cho nó, và họ nói rằng phương pháp ảo có thể gây khó khăn để gỡ lỗi, lỗi khôn lanh, vì vậy họ không thể làm điều này. Tôi mơ hồ nhớ một cách để "hoàn thành"/con dấu các phương pháp ảo vì vậy đó là lý do tại sao tôi hỏi điều này, và nếu họ quan tâm, họ có thể sử dụng .. –

+0

từ khóa kín để niêm phong các phương pháp ảo đó. Cũng nói với họ nếu thừa kế không dành cho thư viện của họ, thì các loại nên được niêm phong để thực hiện. Nhưng với những kiểu này có các hàm tạo bên trong, nó không thể thực sự sử dụng chúng. Bạn nghĩ sao? Bạn có nghĩ rằng mối quan tâm của họ đối với thừa kế và phương pháp ảo có hợp lệ không? –

Trả lời

22

Có: khi ghi đè phương thức bạn cũng có thể khai báo nó sealed.

+2

Câu trả lời hay. Một điểm làm rõ cho OP; chỉ những phần ghi đè của các phương thức ảo (bản thân chúng cũng là ảo) có thể được niêm phong; khai báo có 'virtual' cũng không thể được' niêm phong'. Nó dư thừa; từ khóa kín "undoes" một từ khóa ảo hoặc trừu tượng làm cho phương thức ảo trong lớp cơ sở. Phải có ít nhất một mức độ kế thừa giữa việc tạo phương thức ảo và niêm phong nó. – KeithS

+0

Cảm ơn KeithS, bạn có thể đưa ra một ví dụ về mã này không? Tôi không nghĩ rằng tôi hiểu nó. –

+3

về cơ bản, 'công khai ghi đè void MyMethod()' biên dịch. 'public virtual void void MyMethod()' không, bởi vì ở cùng cấp độ thừa kế, bạn đang đánh dấu phương thức là overridable và không overridable. Nó dư thừa; 'public void MyMethod()' sẽ tạo ra một phương thức không thể ghi đè. Đó là điểm tôi đang cố gắng thực hiện; mặc dù các phương thức ảo có thể được niêm phong, nhưng chúng thực sự phải ghi đè phương thức cơ sở ban đầu được đánh dấu là ảo. – KeithS

7

Bạn có thể sử dụng sealed.

Các vấn đề liên quan