Tôi có một lớp generics với một lớp con cung cấp các loại cụ thể.Bạn có thể phân lớp một lớp generics với một lớp được gõ cụ thể không?
public abstract class GenericBase<T>
where T:Interface1
{
}
tôi phân lớp generics với việc triển khai cụ thể:
public class Customer:
GenericBase<Type1>
(Type1
cụ Interface1
).
Tôi có một lớp cơ sở trừu tượng mà có một tài liệu tham khảo như sau:
protected GenericBase<Interface1> genericInstance;
Cuối cùng, khi tôi cố gắng để gán genericInstance đến một thể hiện của các lớp cơ sở, nó mang lại cho tôi một lỗi biên dịch, nói rằng nó "không thể chuyển đổi hoàn toàn Khách hàng thành GenericBase <Interface1>".
base.genericInstance = new Customer(); //Compiler error
Tôi không hiểu tại sao tôi sẽ nhận được lỗi này nếu Customer
là một subtype của GenericBase<Type1>
, và Type1
thực hiện Interface1
. Không phải là Customer
có hiệu quả là loại GenericBase<Interface1>
, nếu đó là một phân lớp của GenericBase<Type1>
?
Tôi cho rằng tôi hiểu nhầm về một số thứ về generics ở đây; có cách nào để cho phép hành vi này không?
Không chắc chắn về C#, nhưng điều này chắc chắn không hoạt động trong Java. Trong Java, 'genericInstance' sẽ phải được khai báo là' protected GenericBase mở rộng Interface1> genericInstance' (lưu ý: Tôi đã không thử nó để xem nếu nó thực sự hoạt động). – Powerlord
[Hiệp phương sai và Contravariance] (https://msdn.microsoft.com/en-us/library/ee207183) –
Quy tắc của ngón tay cái là generics không phải là biến thể bởi vì bạn không thể nói điều gì sẽ được thực hiện với nó. Tôi không thể gán một 'List' vào một 'List ' vì nếu không, tôi có thể thêm một 'Dog' vào' List 'mặc dù nó thực sự là một' List ' –
Powerlord