Nếu tôi có một lớp mục chung mà trông như thế này:C# Generics: Đơn giản hóa kiểu chữ ký
abstract class Item<T>
{
}
Và một container của mục đó trông như thế này:
class Container<TItem, T>
where TItem : Item<T>
{
}
Kể từ TItem phụ thuộc vào T , nó có thể đơn giản hóa chữ ký loại của Container để nó chỉ mất một tham số kiểu?
class Container<TItem>
where TItem : Item // this doesn't actually work, because Item takes a type parameter
{
}
Vì vậy, tôi có thể nhanh chóng nó như sau::
class StringItem : Item<string>
{
}
var good = new Container<StringItem>();
var bad = new Container<StringItem, string>();
Trình biên dịch sẽ có thể suy ra rằng T là chuỗi khi TItem là StringItem, phải một cái gì đó này những gì tôi thực sự muốn là? Làm thế nào để tôi thực hiện điều này?
mong muốn sử dụng:
class MyItem : Item<string>
{
}
Container<MyItem> container = GetContainer();
MyItem item = container.GetItem(0);
item.MyMethod();
Tôi nghĩ rằng bạn có thể. Đa hình của nó. Bạn có thể ghi đè lên các phương thức trừu tượng. –
Trong trường hợp đó, bạn có thể tạo lớp StringContainer là lớp StringContainer trong đó TItem: Mục –
RockWorld
Tôi không tin rằng trình biên dịch có thể _partially_ suy ra các loại chung chung. –