3 回答
TA贡献1765条经验 获得超5个赞
您当前的抽象类要求该方法接受任何实现IDocumentArgs. 您可以或许检查,当它在真实传递的类型,但是编译器本身不会强制执行它。
您可以做的一件事是将抽象类更改为泛型。像这样的东西:
public abstract class DocumentWriter<T> where T : IDocumentArgs
{
protected abstract void FillContent(T args);
}
请注意where对类型参数的约束,要求实现类型仅使用 的派生IDocumentArgs作为类型参数。
然后在实现该类时,明确提供类型参数:
public class ActualDocumentWriter : DocumentWriter<ActualDocumentArgs>
{
protected override void FillContent(ActualDocumentArgs args)
{
// Do stuff
}
}
TA贡献1898条经验 获得超8个赞
您可以使用通用约束:
public abstract DocumentWriter<T>
where T : IDocumentArgs
{
(...)
protected abstract void FillContent(T args);
}
public class ActualDocumentWriter : DocumentWriter<ActualDocumentArgs>
{
(...)
protected override void FillContent(ActualDocumentArgs args)
{
// Do stuff
}
}
TA贡献1829条经验 获得超9个赞
我不能使用 IDocumentArgs 作为输入,因为那时我将无法访问自定义属性。
是设计错误的指示。你不应该想要那个。
您可以绕过它,在覆盖方法中,您可以对其进行类型转换:
protected override void FillContent(IDocumentArgs args)
{
var actualArgs = args as ActualDocumentArgs ;
// Do stuff
}
但这是一个黑客。
- 3 回答
- 0 关注
- 151 浏览
添加回答
举报