2011-12-26 33 views
8

Tôi đang cố gắng tạo ra một cơ chế giống như mô hình nhà máy chung.Tôi có thể buộc con cháu có một hàm tạo tham số không?

Nhà máy sẽ như thế nào:

public class APlugin<ActionType> where ActionType : IAction 
{ 
    // create a new action. Note: ActionType should contain 
    // an empty constructor 
    public ActionType CreateAction() 
    { 
     return Activator.CreateInstance<ActionType>(); 
    } 
} 

Những hậu duệ của IAction có thể ẩn các nhà xây dựng parameterless và điều này sẽ gây ra các nhà máy để thất bại.

+0

Give it các() ràng buộc mới vì vậy bạn chỉ có thể sử dụng các nhà xây dựng, actionType mới(). Nhưng không nhất thiết phải hữu ích trong các kịch bản trình cắm thêm. –

+1

Khi bạn nói "hàm tạo rỗng", bạn có nghĩa là một hàm tạo không có tham số không? – Gabe

+0

Có @Gabe. Chính xác – Odys

Trả lời

8

Bạn không thể ép buộc một hàm tạo rỗng hoặc bất kỳ kiểu hàm tạo nào trên các kiểu có nguồn gốc.

Các nhà xây dựng không được kế thừa, nhưng được gọi.

Nếu không xích vào hàm tạo cơ sở (sử dụng cú pháp : base()), hàm tạo cơ sở mặc định sẽ được gọi ngầm.

Từ Using Constructors trên MSDN:

Trong một lớp học có nguồn gốc, nếu một nhà xây dựng cơ sở lớp không được gọi bằng một cách rõ ràng từ khóa cơ bản, sau đó các nhà xây dựng mặc định, nếu có một, được gọi là ngầm.

9

Bạn có thể đảm bảo lớp có hàm tạo không có đối số bằng cách cung cấp ràng buộc chung where T : new(). Tuy nhiên, nó chỉ ảnh hưởng đến loại T. Có chứa lớp sẽ không bị ảnh hưởng, vì vậy bạn có thể đảm bảo ActionType trong trường hợp của bạn đã cho biết hàm tạo, nhưng bạn không thể thực thi lớp đó trên bất kỳ lớp nào kế thừa từ APlugin<T>.

+0

Ràng buộc kiểu generic 'new()' đơn giản có nghĩa là phải có một hàm tạo tham số công khai. Nó không ngăn cản các nhà xây dựng với các tham số tồn tại đối với kiểu ràng buộc (hoặc các kiểu có nguồn gốc). – Oded

+2

Tôi biết những gì 'mới()' hiện, nhưng tôi không chắc chắn những gì OP đang cố gắng để đạt được. Có vẻ như anh ta muốn đảm bảo rằng 'Activator.CreateInstance ()' sẽ không thành công vì không có các hàm tạo tham số. Việc thêm ràng buộc vào 'ActionType' sẽ giải quyết vấn đề đó. Nó sẽ không ngăn cản việc thêm các hàm tạo với các tham số miễn là có tham số một. – MagnatLU

+0

(cont.) Vì vậy, có thể có kiểu triển khai thực hiện từ IAction không có hàm tạo mặc định, nhưng bạn sẽ gặp lỗi trình biên dịch khi cố gắng sử dụng nó như kiểu generic 'ActionType' trong' APlugin'. – MagnatLU

0

Khá muộn nhưng tôi nghĩ rằng điều này đáng để biết ..

Bạn có thể buộc các nhà xây dựng có 0 tham số trên các lớp không trừu tượng. Đây là một ràng buộc kiểu để sử dụng bất cứ khi nào bạn muốn thực thi các ràng buộc đó trên một cấu trúc lớp. Nó đòi hỏi bạn phải xác định loại thực hiện giao diện mà có thể được tìm thấy đáng lo ngại. Đó là giá nếu bạn muốn một số loại an toàn gọn gàng.

public interface IEmptyConstructor<TThis> where TThis : IEmptyConstructor<TThis>, new() {} 

ví dụ như một cấu trúc singleton

public abstract class Singleton<TThis> : ISingleton where TThis : Singleton<TThis>, new() { /* some singleton madness */ } 
Các vấn đề liên quan