2008-09-04 40 views
12

Tôi có một số lớp học đặt ra như thế nàyTôi có thể ngăn chặn một phương thức ảo kế thừa bị ghi đè trong các lớp con không?

class A 
{ 
    public virtual void Render() 
    { 
    } 
} 
class B : A 
{ 
    public override void Render() 
    { 
     // Prepare the object for rendering 
     SpecialRender(); 
     // Do some cleanup 
    } 

    protected virtual void SpecialRender() 
    { 
    } 
} 
class C : B 
{ 
    protected override void SpecialRender() 
    { 
     // Do some cool stuff 
    } 
} 

Có thể để ngăn chặn sự lớp C từ trọng phương pháp Render, mà không vi phạm các mã sau đây?

A obj = new C(); 
obj.Render();  // calls B.Render -> c.SpecialRender 

Trả lời

31

Bạn có thể niêm phong phương pháp cá nhân để ngăn chặn chúng khỏi bị overridable:

public sealed override void Render() 
{ 
    // Prepare the object for rendering   
    SpecialRender(); 
    // Do some cleanup  
} 
1

Trong B, làm

protected override sealed void Render() { ... } 
0

vâng. Nếu bạn đánh dấu một phương thức là Sealed thì nó không thể được overriden trong một lớp dẫn xuất.

2

Vâng, bạn có thể sử dụng từ khóa kín trong việc thực hiện các lớp B của Render:

class B : A 
{ 
    public sealed override void Render() 
    { 
     // Prepare the object for rendering 
     SpecialRender(); 
     // Do some cleanup 
    } 

    protected virtual void SpecialRender() 
    { 
    } 
} 
1

thử sealed

class B : A 
{ 
    protected sealed override void SpecialRender() 
    { 
    // do stuff 
    } 
} 

class C : B 
    protected override void SpecialRender() 
    { 
    // not valid 
    } 
} 

Tất nhiên, tôi nghĩ rằng C có thể khắc phục nó bằng cách new.

0

Một khác (? Tốt hơn) cách được probablby sử dụng từ khóa mới để ngăn chặn một phương pháp ảo cụ thể từ việc overiden:

class A 
{ 
    public virtual void Render() 
    { 
    } 
} 
class B : A 
{ 
    public override void Render() 
    { 
     // Prepare the object for rendering  
     SpecialRender(); 
     // Do some cleanup  
    } 
    protected virtual void SpecialRender() 
    { 
    } 
} 
class B2 : B 
{ 
    public new void Render() 
    { 
    } 
} 
class C : B2 
{ 
    protected override void SpecialRender() 
    { 
    } 
    //public override void Render() // compiler error 
    //{ 
    //} 
} 
+1

Bất kỳ lời giải thích tại sao điều này tốt hơn? Sealed có một ý nghĩa khá sạch sẽ. Nó nói "Sau khi suy nghĩ một số tôi đã đi đến kết luận rằng điều này không bao giờ nên được ghi đè". – Ivan

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