使用 base 调用虚方法
Virtual method being called using base
关于虚拟方法:
protected internal virtual void PopulateGetParameters(
int id, List<SqlParameter> parameters)
{
}
在继承基础 class 的 class 中被覆盖。令我困惑的是覆盖方法正在回调虚拟方法?
protected override void PopulateGetParameters(
int id, List<SqlParameter> parameters)
{
base.PopulateGetParameters(id, parameters);
parameters.Add(new SqlParameter(this.KeyParamName, id));
}
看来虚拟方法是要被覆盖的。调用base.PopulateGetParameters(id, parameters);
的目的是什么?我也无法真正找出实施发生的位置 base.PopulateGetParameters
是一个空的 virtual
方法,并且覆盖出于某种原因调用它。
虚方法 可以 如果需要可以重写。没有规则反对:
(a) 没有这样做,
(b) 不调用 base
实现。
因为在这种情况下,基础 class 实现什么都不做,最好创建一个接口并在那里定义 PopulateGetParameters
。然后调用 base
变得不可能,而不是像您的示例代码当前那样毫无意义。
virtual
关键字仅用于允许方法被覆盖。
在 C# 中,默认情况下,方法是 非虚方法,您不能重写非虚方法。这与 Java 相反,默认情况下所有方法都是虚拟的。
在您的情况下,调用该方法的基本实现不会执行任何操作,因为它是空的。不过反正叫它完全没问题,其实也很常见。
您可以找到更多信息here。
关于虚拟方法:
protected internal virtual void PopulateGetParameters(
int id, List<SqlParameter> parameters)
{
}
在继承基础 class 的 class 中被覆盖。令我困惑的是覆盖方法正在回调虚拟方法?
protected override void PopulateGetParameters(
int id, List<SqlParameter> parameters)
{
base.PopulateGetParameters(id, parameters);
parameters.Add(new SqlParameter(this.KeyParamName, id));
}
看来虚拟方法是要被覆盖的。调用base.PopulateGetParameters(id, parameters);
的目的是什么?我也无法真正找出实施发生的位置 base.PopulateGetParameters
是一个空的 virtual
方法,并且覆盖出于某种原因调用它。
虚方法 可以 如果需要可以重写。没有规则反对:
(a) 没有这样做,
(b) 不调用 base
实现。
因为在这种情况下,基础 class 实现什么都不做,最好创建一个接口并在那里定义 PopulateGetParameters
。然后调用 base
变得不可能,而不是像您的示例代码当前那样毫无意义。
virtual
关键字仅用于允许方法被覆盖。
在 C# 中,默认情况下,方法是 非虚方法,您不能重写非虚方法。这与 Java 相反,默认情况下所有方法都是虚拟的。
在您的情况下,调用该方法的基本实现不会执行任何操作,因为它是空的。不过反正叫它完全没问题,其实也很常见。
您可以找到更多信息here。