只在抽象类的多个子类中的一个子类中添加一个额外的方法
本文关键字:一个 子类 方法 添加 抽象类 | 更新日期: 2023-09-27 18:00:34
我有一个抽象类,但有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);
}
}
当我添加这个新方法而不在抽象类中时,我遇到了一个错误。
对子类实例的超类引用不能访问未在超类中定义的方法。您需要将引用显式转换为子类引用类型,以便能够从子类访问额外的方法。
设A
为abstract
类,设B
为具有额外方法extra
的类。设a
是A
类型对B
类型实例的引用。要访问B
中的额外方法,请执行以下操作:
((B)a).extra();
也就是说,如果只有一个类需要不同的附加行为,那么应该考虑使用组合而不是继承。请参阅这个答案,它解释了著名的鸭子问题,该问题类似于您当前所处的