问题转换为SortedList <int,t =“”>其中T是派生类</int,>

时间:2014-01-17 22:42:25

标签: c# inheritance

所以,我有一个包含5个基类的项目:

File
FileRecord
FileDetailRecord : FileRecord
FileHeaderRecord : FileRecord
RecordDetail

那些联系起来像:

文件包含FileRecords,FileRecord可以是FileDetailRecord或FileHeaderRecord,FileRecords包含RecordDetails

然后我有两个基类的子集,输出和输入。所以我有

OutputFile : File
OutputFileDetailRecord : FileDetailRecord
OutputFileHeaderRecord : FileHeaderRecord
OutputRecordDetail : RecordDetail

与输入相同。我目前遇到的问题是我的文件类(File,OutputFile,InputFile)中的一个成员。

我的文件类是这样编写的:

public class File {

    public virtual FileHeaderRecord FileHeaderRecord { get { return fileHeaderRecord; } }
    protected virtual FileHeaderRecord fileHeaderRecord { get; set; }

    public virtual SortedList<int, FileDetailRecord> FileDetailRecords { get { return fileDetailRecords; } }
    protected virtual SortedList<int, FileDetailRecord> fileDetailRecords { get; set; }

}

我在OutputFile类中尝试做的是:

public class OutputFile : File {

    public override FileHeaderRecord FileHeaderRecord {
        get {
            if (fileHeaderRecord == null)
                fileHeaderRecord = new OutputFileHeaderRecord();

            return fileHeaderRecord;
        }
    }       

    public override SortedList<int, FileDetailRecord> FileDetailRecords {
        get {
            if (fileDetailRecords == null)
                fileDetailRecords = (SortedList<int, OutputFileDetailRecord>)new SortedList<int, FileDetailRecord>();
        }
    }

}

使用我的OutputFileDetailRecord类:

public class OutputFileDetailRecord : FileDetailRecord {

    public OutputFileDetailRecord()
        : base() {

    }

    public override bool IsValid {
        get {
            return base.IsValid;
        }
    }

}

我得到的错误是

Error   1   Cannot convert type     'System.Collections.Generic.SortedList<int,MerchBulkLoad.Utils.Base.FileDetailRecord>' to     'System.Collections.Generic.SortedList<int,MerchBulkLoad.Utils.Output.OutputFileDetailRecord>'

我也试图像这样暗示:

fileDetailRecords = new SortedList<int, OutputFileDetailRecord>();

但那只是告诉我,我无法暗中施展它。自从我使用C#以来已经有几个月了,所以我现在非常生疏。谁能指出我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

正如评论所述,泛型类型是不变的;并且您遇到了类设计的方差问题。定义自己的排序列表合同,生活可以很容易。

假设我们声明了接口IMySortedList,我们可以使用它代替SortedList来声明类中的属性:

public interface IMySortedList<TKey, out TValue>: IEnumerable {
    // .. 
}

并且一个类实现它:

public class MySortedList<TKey, TValue>
    : SortedList<TKey, TValue>, IMySortedList<TKey, TValue> {
    // .. 
}

这样我们就可以说:

public class OutputFile: File {
    public override FileHeaderRecord FileHeaderRecord {
        get {
            if(fileHeaderRecord==null) {
                fileHeaderRecord=new OutputFileHeaderRecord();
            }

            return fileHeaderRecord;
        }
    }

    public override IMySortedList<int, FileDetailRecord> FileDetailRecords {
        get {
            if(fileDetailRecords==null) {
                fileDetailRecords=
                    new MySortedList<int, OutputFileDetailRecord>();
            }

            return fileDetailRecords;
        }
    }
}

请注意,上面的代码缺少实现细节,它应该是您的设计,而不是我的..