Tôi có một phương thức factory đơn giản cung cấp một cá thể triển khai cụ thể dựa trên một tham số kiểu generic được cung cấp. Nếu các lớp cụ thể kế thừa từ một lớp cơ sở trừu tượng chung với tham số kiểu tôi không thể truyền chúng. Trình biên dịch cho tôi biết Error 2 Cannot convert type 'Car' to 'VehicleBase<T>'
. Nó hoạt động tốt nếu tôi thay thế lớp trừu tượng cho một giao diện có cùng tham số kiểu, hoặc nếu tôi loại bỏ tham số kiểu generic từ lớp trừu tượng.Không thể truyền kiểu dẫn xuất đến lớp trừu tượng cơ sở với tham số kiểu
interface IWheel
{
}
class CarWheel : IWheel
{
}
abstract class VehicleBase<T>
{
}
class Car : VehicleBase<CarWheel>
{
}
class VehicleFactory
{
public static VehicleBase<T> GetNew<T>()
{
if (typeof(T) == typeof(CarWheel))
{
return (VehicleBase<T>)new Car();
}
else
{
throw new NotSupportedException();
}
}
}
Điều này không biên dịch trên (VehicleBase<T>)new Car()
. Đây có phải là một khiếm khuyết trình biên dịch, hay đây có thể là một quyết định thiết kế có chủ ý để xử lý các lớp trừu tượng và các giao diện với các tham số kiểu khác nhau không?
Để giải quyết sự cố, tôi luôn có thể tạo lớp trừu tượng triển khai giao diện và sử dụng giá trị trả về cho phương thức nhà máy của mình, nhưng tôi vẫn muốn biết tại sao hành vi này xảy ra.
Đây là giải pháp mà tôi đã sử dụng. Cảm ơn bạn đã nhắc tôi về phương sai trong giao diện/đại biểu mặc dù - điều đó có ý nghĩa và trả lời câu hỏi của tôi. – dahvyd
Cảm ơn bạn đã nhắc tôi. Nó quá dễ dàng để quên khi bạn chỉ cần có được một số mã ra cửa –