接口中的父/子关系

时间:2009-10-15 21:06:14

标签: c#

如果我有这样的接口:

public interface IAlbum
{
    string Title { get; set; }
}

public interface ITrack
{
    string Title { get; set; }
    float Duration { get; set; }
}

向IAlbum界面添加曲目列表的最佳方法是什么?如果我希望单个轨道成为属性而没有暴露的轨道阵列会怎样?

3 个答案:

答案 0 :(得分:5)

使用indexer。具体做法是:

    ITrack this[int trackIndex]
    {
        get;
    }

答案 1 :(得分:2)

曲目列表可以是:

IList<ITrack> Tracks {get;}

IEnumerable<ITrack> Tracks {get;}

如果您希望具体类型公开更具体的API,您可以通过显式实现来实现上述内容。

理论上你可以做:

interface IAlbum : IEnumerable<ITrack> {...}

但我认为这不是一个好主意。

将曲目重新显示为属性;如果我理解正确,你可以在运行时通过在具体专辑类型上实现ICustomTypeDescriptor来实现这种“类型”。但它是非常重要的并且有点混乱 - 除非你使用数据绑定,否则它将无济于事。

答案 2 :(得分:0)

您还可以提供适用于曲目标题的索引器。这是[轨道属性]和集合之间的[种类]。

ITrack this[string trackName]
{
    get { return getTraxckUsingName(trackName); }
}