2010-04-16 36 views
7

Tôi cố gắng để làm như sau:Tại sao tôi không thể thực thi các lớp dẫn xuất để có các hàm tạo tham số?

class Program 
{ 
    static void Main(string[] args) 
    { 
     foo<baz> fooObject = new foo<baz>(); 
     AnotherClass<baz> _baz = new AnotherClass<baz>(); 
     _baz.testMethod(fooObject); 
    } 
} 

public class AnotherClass<T> where T : bar 
{ 
    public void testMethod(foo<T> dummy) 
    { 
     foobar = dummy; 
    } 

    private foo<T> foobar = null; 
} 

public class foo<T> where T : bar, new() 
{ 
    public foo() 
    { 
     _t = new T(); 
    } 

    private T _t; 

} 

public abstract class bar 
{ 
    public abstract void someMethod(); 
    // Some implementation 
} 

public class baz : bar 
{ 
    public override void someMethod() 
    { 
     //Implementation 
    } 
}  

Và tôi nhận được một lỗi giải thích rằng 'T' phải là một loại phi trừu tượng với một constructor parameterless nào để sử dụng nó như là tham số 'T' trong loại hoặc phương pháp chung. Tôi hoàn toàn hiểu tại sao điều này phải, và cũng hiểu rằng tôi có thể truyền một đối tượng được khởi tạo trước kiểu 'T' vào làm đối số hàm tạo để tránh phải 'mới' nó, nhưng có cách nào xung quanh điều này không? cách nào để thực thi các lớp bắt nguồn từ 'bar' để cung cấp các hàm tạo parameterless?

Cố định - Tôi đã thiếu ràng buộc 'mới()' trên AnotherClass().

Trả lời

5

Không phải bạn thiếu) ràng buộc mới (trên AnotherClass của bạn?

public class AnotherClass<T> where T : bar, new() 

Nếu không có VS2010 từ chối biên dịch, với điều đó hoạt động tốt.

+0

Cảm ơn, điều này dường như đã sửa nó! –

0

Cú pháp chung không phải là mới() thay vì chỉ mới?

Ngoài ra, bạn đang làm mã này ở giữa một lớp học chứ không phải là trong một chức năng, mà chắc chắn sẽ baffle nó:

_t = new T(); 

Edit:

Ok, vì vậy sau khi làm sạch cú pháp, tôi đoán vấn đề là 'baz' không có một hàm tạo tham số. Tôi không biết cách nào bạn có thể thực thi điều này.

Có một câu hỏi tương tự here, có thể giúp ích một chút.

+0

"Ở giữa lớp": đây chỉ là khai báo trường có giá trị ban đầu. –

+0

Cố định, cảm ơn. Thói quen xấu của tôi về nửa giả mã, một nửa mã thực! –

7

Cú pháp đúng là

public class foo<T> where T : bar, new() 
+0

Xin lỗi, tôi đã gõ vội vàng. –

0

Giống như cách giải quyết - Bạn có thể vượt qua đại biểu tạo ra thể hiện của một loại bạn cần:

Func<T> creator = ... 

    _t = creator(); 
1

Mã của bạn biên dịch trong VS2010.

Bạn có thể muốn sử dụng giao diện thay vì:

public class foo<T> where T : ibar, new() 
... 

public interface ibar 
{ 
    void someMethod(); 
} 

public abstract class bar : ibar 
{ 
    public abstract void someMethod(); 
    // Some implementation 
} 
+0

Điều này tạo ra cùng một vấn đề cho tôi ... –

0

loại bỏ đầu tiên "mới()" từ khoá "ở đâu" của lớp "Foo" Sau khi phải thay đổi constructor như

public foo() 
{ 
    _t = Activator.CreateInstance<T>(); 
} 

Đối với tôi làm việc!

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