我有一个抽象类,但它有6种不同的实现。现在对于其中一个我想添加一个额外的公共方法但不想将它添加到抽象类中,因为其他5个实现不需要它。
有没有办法实现这个?当我添加这个新方法而没有它在抽象类中时,我收到一个错误。
以下是代码:
namespace Results.Parser
{
public abstract class Parser<T> where T: ReportItem
{
public abstract string GetNodeName();
public abstract IEnumerable<ReportItem> ParseXml(TextReader stream);
public abstract List<ReportItem> SumValueOfDuplicateRows(List<T> reportList);
public virtual bool MeetsCriteria(ReportItem reportItem)
{
return reportItem.Value.SafeConvertToDecimal() != 0;
}
}
}
public class ElementParser : Parser<ReportItem>
{
public override string GetNodeName()
{
return "Element";
}
public override List<ReportItem> SumRiskValueOfDuplicateRows(List<ReportItem> reportList)
{
// do something
}
public void SerializeXml(TextReader stream)
{
//new method which is not in abstract class
}
public override IEnumerable<ReportItem> ParseXml(TextReader stream)
{
//do something
}
}
namespace Results.Producer
{
public class RepositoryManager
{
private void GetResponse(TextReader stream)
{
var parser = new ElementParser();
parser.SerializeXml(stream);
}
}
答案 0 :(得分:0)
当我添加这个新方法而没有它在抽象类中时,我收到一个错误。
对子类实例的超类引用无法访问超类中未定义的方法。您需要显式转换对子类引用类型的引用,以便能够从子类访问额外的方法。
让A
成为abstract
类,让B
成为您有一个名为extra
的额外方法的类。让a
成为类型为A
的{{1}}类型的引用。要访问B
中的额外方法,请执行以下操作:
B
话虽如此,如果只有一个类需要额外的行为,那么你应该考虑使用组合而不是继承。请参阅this答案,该答案解释了与您目前的情况类似的着名鸭子问题