2009-04-28 42 views
38

Trong C#, có thể đánh dấu một phương thức ảo được ghi đè là cuối cùng để người thực thi không thể ghi đè lên nó? Tôi sẽ làm như thế nào?có thể đánh dấu phương thức ghi đè là

Một ví dụ có thể làm cho nó dễ dàng hơn để hiểu:

class A 
{ 
    abstract void DoAction(); 
} 
class B : A 
{ 
    override void DoAction() 
    { 
     // Implements action in a way that it doesn't make 
     // sense for children to override, e.g. by setting private state 
     // later operations depend on 
    } 
} 
class C: B 
{ 
    // This would be a bug 
    override void DoAction() { } 
} 

Có cách nào để sửa đổi B để ngăn chặn những đứa trẻ khác C từ trọng DoAction, hoặc tại thời gian biên dịch hoặc thời gian chạy?

Trả lời

62

Vâng, với "kín":

class A 
{ 
    abstract void DoAction(); 
} 
class B : A 
{ 
    sealed override void DoAction() 
    { 
     // Implements action in a way that it doesn't make 
     // sense for children to override, e.g. by setting private state 
     // later operations depend on 
    } 
} 
class C: B 
{ 
    override void DoAction() { } // will not compile 
} 
8

Bạn có thể đánh dấu phương thức là sealed.

http://msdn.microsoft.com/en-us/library/aa645769(VS.71).aspx

class A 
{ 
    public virtual void F() { } 
} 
class B : A 
{ 
    public sealed override void F() { } 
} 
class C : B 
{ 
    public override void F() { } // Compilation error - 'C.F()': cannot override 
           // inherited member 'B.F()' because it is sealed 
} 
+0

bạn có thể làm cho các phương pháp riêng được niêm phong trên thực tế – annakata

+0

tại sao bạn đánh dấu lớp là bị niêm phong? Bạn có thể chỉ định công cụ sửa đổi này ở cấp phương thức ... –

+0

Thú vị tôi chưa bao giờ biết bạn có thể đóng dấu các phương thức tuy nhiên tôi chưa bao giờ có lý do. –

5

phương pháp cá nhân có thể được đánh dấu là niêm phong, đó là một cách rộng rãi tương đương với đánh dấu một phương pháp như thức trong java. Vì vậy, trong ví dụ của bạn, bạn sẽ có:

class B : A 
{ 
    override sealed void DoAction() 
    { 
    // implementation 
    } 
} 
Các vấn đề liên quan