2009-07-07 55 views

Trả lời

14

Nếu căn cứ tầng lớp có cái gì để nói, nhưng bạn muốn nó ghi đè "mỗi lần", sau đó tôi sẽ có một cặp phương pháp:

public void DoSomething() { 
    //things to do before 
    DoSomethingCore(); 
    //things to do after 
} 
protected abstract void DoSomethingCore(); 
+3

Và bạn có thể phải đề cập đến mẫu Phương thức mẫu (hoặc người nào khác bạn có thể quay nhanh) –

+0

Điều gì về từ khóa "ảo" trước phương pháp DoSomething? – Kamarey

+1

@Kamarey Phương thức DoSomething không phải là ảo: đó là phương thức DoSomethingCore mà các lớp con được dự kiến ​​sẽ ghi đè/triển khai thực hiện. – ChrisW

1

Bạn đang tìm kiếm một phương pháp virtual (sử dụng công cụ sửa đổi này cho phép ghi đè phương thức), nhưng bạn không thể buộc người dùng ghi đè lên phương thức đó. Buộc điều này sẽ không có ý nghĩa nếu bạn có một cơ thể anyways, vì người ta chỉ có thể gọi base.YourMethod() và không làm gì khác, mà không giống như không ghi đè phương pháp ở nơi đầu tiên.

public virtual YourMethod() { 
    // your base class code here 
} 

và sau đó là phương pháp trọng trong một lớp học khác nhau:

public override YourMethod() { 
    // code to do before the base call 
    base.YourMethod(); 
    // code to do after the base call 
} 
3

Nếu lớp cơ sở của bạn không một cái gì đó trong phương pháp này, nhưng bạn muốn chắc chắn rằng tất cả các lớp con bị buộc phải thực hiện một số một phần của phương pháp, sau đó bạn muốn Template Method pattern, như được mô tả trong câu trả lời của Marc Gravell.

Không có cách nào để cung cấp triển khai mặc định trong lớp cơ sở của bạn và vẫn buộc các lớp con cung cấp triển khai của riêng chúng. Tuy nhiên, bạn có thể tạo một lớp cơ sở trừu tượng và kế thừa từ nó để cung cấp việc thực hiện mặc định, nhưng làm cho lớp bê tông đó được niêm phong.

public abstract class FooBase { 
    public abstract void DoStuff(); 
} 

public sealed class FooImpl : FooBase { 
    public override void DoStuff { 
     //default widget-munging code 
    } 
} 

Bây giờ mọi lớp thừa kế từ FooBase phải triển khai DoStuff(), nhưng bạn có triển khai mặc định FooImpl từ lớp con nào không thể kế thừa.

Bạn cũng có thể muốn ủy quyền trách nhiệm triển khai phương thức cho một lớp riêng biệt, được chuyển đến lớp cơ sở trong hàm tạo của nó. Đó được gọi là Strategy pattern.

public sealed class Foo { 
    private IFooStrategy _strategy; 
    public Foo(IStrategy strategy) { 
     _strategy = strategy; 
    } 
    void DoStuff() { 
     _strategy.DoStuff(); 
    } 
    public static IFooStrategy DefaultStrategy { 
     //return singleton instance of the default strategy 
    } 
} 

Bây giờ thay vì subclassing Foo, bạn thay vì tạo ra hiện thực mới của giao diện IFooStrategy, và vượt qua những để dụ Foo của bạn. Vì vậy, bạn có thể làm:

new Foo(Foo.DefaultStrategy); 

hoặc

new Foo(new DifferentStrategy()); 
1

Âm thanh như thực hiện cơ sở của bạn sẽ không bao giờ được gọi. Tại sao bạn muốn cung cấp một triển khai mà không ai có thể thực hiện (nhảy qua các vòng không chịu nổi)

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