2010-02-28 10 views
7

Với mã khách hàng như sau:A A Constructor có thể trả về SubClass không?

var obj = new Class1(); 

Có cách nào để thay đổi các nhà xây dựng của Class1 để nó sẽ thực sự trở lại một lớp con (hoặc một số thực hiện thay thế khác) để thay thế?

Tôi muốn obj nhận được một trong hai cách triển khai khác nhau, tùy thuộc vào một số điều kiện. Rõ ràng, tôi có thể thay đổi để sử dụng một nhà máy hoặc khuôn khổ DI, nhưng tôi muốn tránh thay đổi mã khách hàng, nếu có thể.

Tôi cho rằng câu trả lời là không, nhưng tôi tự hỏi nếu có một số cách thông minh để làm điều đó xảy ra.

+4

Chúng tôi đang xem xét thêm tính năng "mở rộng mới", về cơ bản sẽ cho phép bạn tạo phương thức nhà máy tĩnh sẽ được gọi khi toán tử "mới" được sử dụng, giống như phương thức mở rộng được gọi khi "." toán tử được sử dụng. Nó sẽ là một đường cú pháp đẹp cho nhà máy. Nếu bạn có một kịch bản thực sự tuyệt vời mà kiểu mẫu này sẽ hữu ích, tôi rất muốn xem một ví dụ. –

+1

@Eric: trong khi nó không phải là một ví dụ C# cụ thể, tôi đã đi qua một tình huống mà điều này sẽ hữu ích trong C + +. Tôi đang phát triển một thư viện đa nền tảng, và nó thực sự hữu ích cho một ABC nền tảng bất khả tri để có thể trả về một cá thể lớp nền tảng cụ thể có nguồn gốc từ constructor của nó. Tôi chắc chắn phải có những tình huống tương tự để được tìm thấy khi phát triển với C#. – Mac

+0

@Eric Lippert - Tôi có một kịch bản thế giới thực dành cho bạn! http://blog.hackensplat.com/2010/09/construct-something-else-c.html – billpg

Trả lời

4

Điều này là không thể.

Giải pháp thay thế thông minh bao gồm thay thế hàm tạo bằng hàm static hoặc (không được khuyến nghị) bằng cách sử dụng trình bao bọc xung quanh lớp cơ sở và tạo các lớp được gói khác nhau.

8

Bạn có thể thay thế các nhà xây dựng với một phương pháp nhà máy, và trả lại bất cứ bạn thích, tùy thuộc vào các thông số:

public Class2 : Class1 {} 

public static Class1 CreateClass1(bool returnDerivedClass) 
{ 
    if (returnDerivedClass) 
    { 
     return new Class2(); 
    } 
    else 
    { 
     return new Class1(); 
    } 
} 
0

Đối với những thứ như thế này bạn muốn kiểm tra các mô hình Nhà máy. Ngoài ra, tùy theo nhu cầu của bạn, tôi khuyên bạn nên xem xét các phương pháp chung để giảm khớp nối. Cuộc gọi của bạn tới hàm khởi tạo của lớp là sự ghép nối khó nhất mà bạn có thể có trong một chương trình và làm cho những thứ như hoán đổi việc thực hiện ra một rắc rối, như bạn đã phát hiện ra chính mình.

Đọc về "Inversion of control" và "Dependency Injection", có thể đó là những gì bạn thực sự tìm kiếm.

Thư viện đẹp có thể được tìm thấy here.

0

Sử dụng thư viện tiêm. Các liên kết dưới đây trình bày một danh sách lớn của các thư viện tiêm lên đó, và so sánh hiệu suất của chúng

http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison

tôi sẽ đề nghị tuy nhiên hiệu suất đó là hiếm khi một tiêu chí mà bạn sẽ chọn một thư viện tiêm trên, hầu hết các ứng dụng sẽ không nhanh chóng số lượng đối tượng mà anh chàng này đã sử dụng trong các thử nghiệm của mình. Tôi đang sử dụng NInject thực hiện tốt công việc, tuy nhiên nếu tôi bắt đầu một dự án khác, tôi có thể cung cấp cho simpleinjector một lượt, dường như có tất cả các tính năng tôi sử dụng trong NInject và nó hoạt động tốt trong các so sánh hiệu suất.