【发布时间】:2018-06-20 12:04:10
【问题描述】:
我有一个抽象类,它强制执行一个方法,该方法将接口作为输入,如下所示:
public abstract DocumentWriter
{
(...)
protected abstract void FillContent(IDocumentArgs args);
}
创建接口IDocumentArgs 是为了确保参数中包含某些属性,否则这在很大程度上取决于DocumentWriter 的实现。
public interface IDocumentArgs
{
string Title { get; set; }
string Subject { get; set; }
string Author { get; set; }
}
基于这个接口,我做了这个接口的实现,用于DocumentWriter的实现。它看起来像这样:
public class ActualDocumentArgs : IDocumentArgs
{
// Properties enforced by the interface
string Title { get; set; }
string Subject { get; set; }
string Author { get; set; }
// Custom properties
string CustomerName { get; set; }
DateTime DueDate { get; set; }
(...)
}
问题是:我想使用ActualDocumentArgs来实现FillContent()(我想这应该是可能的,因为它实现了IDocumentArgs),像这样:
public class ActualDocumentWriter : DocumentWriter
{
(...)
protected override void FillContent(ActualDocumentArgs args)
{
// Do stuff
}
}
但是如果我这样做,我会得到一个编译时错误:
'ActualDocumentWriter.FillContent(ActualDocumentArgs)': 找不到合适的方法来覆盖。
另一方面,我不能使用IDocumentArgs 作为输入,因为那时我将无法访问自定义属性。
如何解决这个问题?让我头疼……
【问题讨论】:
-
你能
DocumentWriter<T> where T : IDocumentArgs然后protected abstract void FillContent(T args);和class ActualDocumentWriter : DocumentWriter<ActualDocumentArgs>吗? -
实现抽象类时不能加强契约。它要求您接受 any
IDocumentArgs,而不仅仅是ActualDocumentArgs。问题是为什么你需要DocumentWriter类开始? -
@DennisKuypers
DocumentWriter包含一些非抽象方法,然后可以由实际实现使用。我不想定义DocumentWriter的任何实现都应该实现FillContent方法,该方法接受基于(但不限于)IDocumentsArgs的输入。这有意义吗? -
@Noceo 使用抽象类为后代提供实用方法的好选择。在您的情况下,FillDocument 是
protected。那是谁在打电话呢? (也许这不一定是抽象类合同的一部分。如果您将有多种文档信息类型并且您必须找出负责的文档作者是谁,您可以使用stackoverflow.com/questions/50371510/…
标签: c# interface polymorphism abstract-class