Bối cảnh: .NET 4.0, C#C# Sử dụng generics và thực hiện giao diện
Tôi đang tạo một tập hợp các giao diện và một tập hợp các phép thực hiện chúng để cung cấp một số dịch vụ. Các máy khách sử dụng các clases cụ thể nhưng các phương thức gọi được khai báo sử dụng các giao diện như các kiểu tham số.
Một ví dụ đơn giản là thế này một:
namespace TestGenerics
{
// Interface, of fields
interface IField
{
}
// Interface: Forms (contains fields)
interface IForm<T> where T : IField
{
}
// CONCRETE CLASES
class Field : IField
{
}
class Form <T> : IForm<T> where T : IField
{
}
// TEST PROGRAM
class Program
{
// THIS IS THE SIGNATURE OF THE METHOD I WANT TO CALL
// parameters are causing the error.
public static void TestMethod(IForm<IField> form)
{
int i = 1;
i = i * 5;
}
static void Main(string[] args)
{
Form<Field> b = new Form<Field>();
Program.TestMethod(b);
}
}
}
Mã này có ý nghĩa với tôi, nhưng tôi nhận được lỗi biên dịch:
Argument 1: cannot convert from '
TestGenerics.Form<TestGenerics.Field>
' to 'TestGenerics.IForm<TestGenerics.IField>
' TestGenerics
Tôi không chắc chắn những gì tôi đang làm sai , Tôi đã đọc rất nhiều trang trên internet nhưng không ai giải quyết được vấn đề của tôi.
Có một giải pháp mà sẽ không thay đổi mà nhiều kiến trúc của những gì tôi đang cố gắng xây dựng:
Edit: Tôi thiết kế các giao diện theo cách như vậy mà họ cần phải độc lập với clases bê tông mà thực hiện chúng . Các clases cụ thể có thể được nạp từ một dll, nhưng hầu hết các ứng dụng Làm việc với các giao diện. Trong một số trường hợp, tôi cần phải sử dụng các xung đột cụ thể, đặc biệt khi sử dụng các clases cần phải được tuần tự hóa.
Xin cảm ơn trước.
Alejandro
này sẽ thuộc lĩnh vực của hiệp phương sai. Cụ thể, nếu bạn thêm ['out' generic modifier] (http://msdn.microsoft.com/en-us/library/dd469487.aspx) vào chữ ký của bạn' interface IForm trong đó T: IField' thì nó sẽ hoạt động .Nhưng điều này cho biết thêm những hạn chế/cân nhắc khác vì vậy tôi không thể bình luận nếu nó có thể áp dụng cho thiết kế/sử dụng hiện tại của bạn. –
Tôi tò mò bạn đang cố gắng làm gì với thiết kế này. – sidesinger
Cảm ơn rất nhiều vì cả hai đều là những người bảo vệ. Tôi đã thêm một chỉnh sửa giải thích lý do tại sao tôi desinged các giải pháp theo cách đó, nhưng cả hai anwers có thể sửa chữa vấn đề của tôi. Trân trọng. – Sugar