【发布时间】:2014-06-25 18:38:03
【问题描述】:
我有以下代码,它简单地遍历一个 EdiElements 列表并验证每个元素以确保它符合定义为派生类属性的一组规则。
我遇到的问题是elem.Validate() 行调用基类方法而不是派生类方法。 _elements 列表包含所有从 EdiElement 派生的不同类,我需要能够遍历它们并在每个类中执行验证规则。
如下例所示,在 foreach 循环中使用基类作为迭代器变量时,调用派生类方法的标准方法是什么?
public override bool Validate()
{
foreach ( EdiElement elem in _elements )
{
if ( !_checkElementIsValid( this, elem ) )
base.ValidationErrors.Add( string.Format( "Element {0} does not belong to segment {1}", this.GetType().Name, this.GetType().Name ) );
else
elem.Validate(); // <-- I want this to call derived class method
}
return base.ValidationErrors.Count == 0;
}
已编辑以显示类定义。
public abstract class EdiElement : Edi
{
public override bool Validate()
{
return true; // breakpoint here gets hit
}
}
public abstract class EdiDataElement<T> : EdiElement
{
public T Value { get; set; }
}
public class E3286 : EdiDataElement<String>
{
public override bool Validate()
{
return base.Validate(); // breakpoint here does not get hit!
}
}
我忘记添加基类了。
public abstract class Edi
{
protected static List<string> _validationErrors = new List<string>();
public List<string> ValidationErrors
{
get
{
return _validationErrors;
}
}
public abstract bool Validate();
}
【问题讨论】:
-
类/方法是如何定义的?即派生类如何继承/覆盖基类的方法?
-
virtual函数的默认行为是使用派生方法。你能告诉我们类定义吗? -
同意 Ben N。参见msdn.microsoft.com/en-us/library/ms173152.aspx,它说 “在运行时,当客户端代码调用该方法时,CLR 查找对象的运行时类型,并调用覆盖虚方法。因此,在您的源代码中,您可以调用基类上的方法,并导致执行派生类的方法版本。"
-
您使用的是
virtual,对吗?如果您使用new“隐藏”,那将导致您试图避免的那种行为。
标签: c#