【发布时间】:2016-12-19 15:45:25
【问题描述】:
我有一个扩展了其他接口的接口,如下所示:
interface IBase
{
int Id { get; set; }
string Name { get; set; }
}
interface IExtended : IBase
{
bool IsChecked { get; set; }
}
然后我使用基接口作为委托函数中的参数,它也是类构造函数的参数,如下所示:
public class SomeClass
{
private IBase _model;
private Func<IBase, string> _handler;
public SomeClass(IBase model, Func<IBase, string> handler)
{
_model = model;
_handler = handler;
}
public string ExecuteHandler()
{
return _handler(model);
}
}
接口实现:
public class BaseImplementation : IBase
{
int Id { get; set; }
string Name { get; set; }
public BaseImplementation(int id, string name)
{
Id = id;
Name = name;
}
}
public class ExtendedImplementation : IExtended
{
int Id { get; set; }
string Name { get; set; }
bool IsChecked { get; set; }
public BaseImplementation(int id, string name, bool isChecked)
{
Id = id;
Name = name;
IsChecked = isChecked;
}
}
预期用途:
BaseImplemetation baseModel = new BaseImplementation(1, "base");
ExtendedImplemetation extendedModel = new ExtendedImplementation(2, "extended", true);
SomeClass someClass1 = new SomeClass(baseModel, (IBase arg) => {
Console.Write("Remember, " + arg.name + ", YOLO!");
});
SomeClass someClass2 = new SomeClass(extendedModel, (IExtended arg) => {
Console.Write(arg.name + ", YOLO! You're " + (arg.IsChecked) ? "checked!" : "not checked!");
});
string res1 = someClass1.ExecuteHandler();
string res2 = someClass2.ExecuteHandler();
但是那 ( 不起作用,即使 IExtended 的实现必然会实现 IBase 接口定义的所有内容。为什么会这样,我将如何绕过它并获得我想要的结果?
编辑:
我想我现在明白了。
我认为 Func<IBase, string> 等于 Func<IExtended, string> 因为 IExtended 当然实现了 IBase 所做的一切,所以应该没有问题,对吧?按照我的意愿和在我的示例中列出的实现当然可以正常工作。
但是!问题是 someClass2 不能这样构造,因为正如@Servy 提到的,委托函数可以做这样的事情:
SomeClass someClassWrong = new SomeClass(baseModel, (IExtended arg) => {
if (arg.IsChecked) {
// gotcha, baseModel doesn't have IsChecked property!
}
});
编辑 2:
感谢大家的帮助,很抱歉不断编辑并给出我想要的错误示例:D
【问题讨论】:
标签: c# inheritance interface