Phải có điều gì đó cơ bản về giao diện/generics mà tôi chưa học được. Tôi hy vọng sẽ tìm hiểu nó ngay bây giờ.Tại sao danh sách Giao diện không thể sử dụng loại triển khai?
Dưới đây là kịch bản:
Tôi có giao diện này và lớp:
public interface IInterface
{
string TestValue { get; set; }
}
public class RealValue: IInterface
{
public string TestValue { get; set; }
}
Nếu tôi tạo ra một phương pháp như thế này nó biên dịch tốt:
public class RandomTest: IMethodInterface
{
public IInterface GetRealValue()
{
RealValue realValue = new RealValue();
return realValue;
}
}
Lưu ý rằng tôi trả về một đối tượng thực hiện giao diện.
Bây giờ, nếu tôi thêm vào lớp RandomTest
một phương thức trả về danh sách sau đó nó không hoạt động nữa:
public List<IInterface> GetRealValues()
{
List<RealValue> realValues = new List<RealValue>();
return realValues; // ERROR Here <- says it can't convert to a List<IInterface>
}
Vì vậy, tôi đoán là Generics không thể con số này ra, nhưng tại sao?
Có cách nào khác không? Bạn làm gì khi giá trị trả lại của phương thức trên bị khóa vì bạn đang triển khai giao diện như sau:
public interface IMethodInterface
{
IInterface GetRealValue();
List<IInterface> GetRealValues(); // Can't just convert the return types to a concrete
// class because I am implementing this. This
// interface is in a separate project that does not
// have the concrete classes.
}
Có hy vọng nào không? Bạn sẽ làm gì?
Điều này có vẻ tốt đẹp. Tôi sẽ phải đào sâu hơn để hiểu những gì 'out' có nghĩa là cho một param loại chung chung. Dù bằng cách nào, tôi đã thử nó và nó đã làm việc. – Vaccano
Mở rộng câu trả lời bằng một chút thông tin liên quan đến từ khóa 'out'. –
Ngọt ngào! Cảm ơn câu trả lời mở rộng! – Vaccano