我不知道怎么甚至明确短语这个问题,所以这里有两个版本的同一问题:在C#中,有可能是一种揭露其成员的接口类型作为自己
- 结构/类可以通过委托给它的字段/属性来实现一个接口吗?
- 我可以将由字段/属性类型实现的接口映射到其结构/类吗?
这里是添加了伪语法的代码示例,希望能够说明我的意思:
public class School : IEnumerable<Student>
{
private List<Student> students expose IEnumerable<Student>;
...
}
如果这是目前不可能,是潜在的可能吗? ......或者这种方法存在一些严重的问题吗?我认为这可能只是语法糖来摆脱锅炉板代码,否则这些代码在功能上是相同的。例如:
public class School : IEnumerable<Student>
{
private List<Student> students;
...
public IEnumerator<Student> GetEnumerator() { return students.GetEnumerator(); }
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
}
}
这当然是一个很做作和最小的例子。当为它设计界面时,它的好处会更大,特别是当有很多方法“映射”时。
更新: 我知道我提供了一个可怕的例子,但我只是想用最简单的例子。问题的核心不在于具体情况。话虽如此,我的例子很糟糕。所以,要谁希望看到一个很好的例子,陪一个问题更好地帮助人们,这里是一个稍微好一点的一个:
public interface IValidPeriod
{
DateTime ValidFrom { get; }
DateTime ValidTo { get; }
DateTime ValidThrough { get; }
int DaysValid { get; }
}
public class ValidPeriod : IValidPeriod
{
public DateTime ValidFrom { get; private set; }
public DateTime ValidTo { get; private set; }
public DateTime ValidThrough { get { return ValidTo.AddDays(1); } }
public int DaysValid { get { return (ValidTo - ValidFrom).Days; } }
public ValidPeriod(DateTime from, DateTime to)
{
ValidFrom = from;
ValidTo = to;
}
}
public class Agreement : IValidPeriod
{
...
public ValidPeriod ValidPeriod { get; private set; } exposes IValidPeriod;
...
}
public class Contract : IValidPeriod, ICancellable
{
private Agreement agreement exposes IValidPeriod;
...
}
public class Payment : IValidPeriod, ICancellable
{
public DateTime StartDate { get; set; }
private ValidPeriod validPeriod
{
get { return new ValidPeriod(StartDate, DateTime.Max); }
} exposes IValidPeriod;
...
}
public static class SomeUtility
{
public static void CancelIfValidBefore<T>(List<T> items, DateTime date)
where T : IValidPeriod, ICancellable
{
...
}
}
见https://github.com/dotnet/roslyn/issues/13952 –
的第一个问题是,为什么你认为'学校**是**学生的枚举?它有学生,也有教师和其他个人。 '学校'不应该实现那个接口,有公共方法返回学生是绰绰有余的。除非你有更好的例子,否则我怀疑这个功能请求确实是需要的,这基本上是一个尝试解决方案的问题。自动实现*少*方法?我可以自己做,我确实希望明确地看到这个实现,而不是通过一些神秘的'expose'操作符。 – Sinatr
没有“委派”,接口没有执行任何操作。它只是要求你提供一个实现。从列表中派生你的类将是一种简单的方法,但是通常你不能重写Add()方法。委托一份私人名单是很好的,而且很简单。 –