Trong ví dụ sau, tôi có hai ràng buộc, Foobar
và IFoobar<T>
, trên loại T trong lớp chung FoobarList<T>
. Nhưng trình biên dịch đưa ra một lỗi: Không thể chuyển đổi hoàn toàn kiểu 'Foobar' thành 'T'. Một chuyển đổi rõ ràng tồn tại (là bạn thiếu một dàn diễn viên?)Mức độ ưu tiên của nhiều ràng buộc đối với tham số kiểu chung
interface IFoobar<T>
{
T CreateFoobar();
}
class Foobar : IFoobar<Foobar>
{
//some foobar stuffs
public Foobar CreateFoobar() { return new Foobar(); }
}
class FoobarList<T> where T : Foobar, IFoobar<T>
{
void Test(T rFoobar)
{
T foobar = rFoobar.CreateFoobar(); //error: cannot convert Foobar to T
}
}
Dường như trình biên dịch coi CreateFoobar như một phương pháp trong Foobar, nhưng không phải là một trong IFoobar. Tôi có thể sửa chữa các biên dịch bằng cách chia Foobar thành một FoobarBase lớp cơ sở, và thực hiện IFoobar giao diện trong lớp có nguồn gốc của nó, như sau:
interface IFoobar<T>
{
T CreateFoobar();
}
abstract class FoobarBase
{
//some foobar stuffs
}
class Foobar : FoobarBase, IFoobar<Foobar>
{
public Foobar CreateFoobar() { return new Foobar(); }
}
class FoobarList<T> where T : FoobarBase, IFoobar<T>
{
void Test(T rFoobar)
{
T foobar = rFoobar.CreateFoobar();
}
}
Đó là cồng kềnh để chia Foobar thành hai lớp. Có cách nào tốt hơn để sửa lỗi này không?
Việc triển khai giao diện có giúp rõ ràng không? – Rotem