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());
Nguồn
2009-07-07 12:41:44
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) –
Điều gì về từ khóa "ảo" trước phương pháp DoSomething? – Kamarey
@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