如何覆盖具有 out 参数的虚方法?

How to override a virtual method that has an out parameter?

我的基础中有这个虚拟方法class:

public virtual bool AgregarEtapa(DateTime pFechaIngreso, EtapaEnvio.Etapas pEtapa, OficinaPostal pUbicacion, string pNombreRecibio, out string pMensajeError) 
{
    string mensajeError = "";
    bool sePuedeAgregar = false;

    // more code

    pMensajeError = mensajeError;
    return sePuedeAgregar;
}

以及在子 class 中覆盖它的方法,如下所示:

public override bool AgregarEtapa(DateTime pFechaIngreso, EtapaEnvio.Etapas pEtapa, OficinaPostal pUbicacion, string pNombreRecibio, out string pMensajeError)
{
    bool seHace = true;
    bool exito = false;

    // more code here

    if (seHace) 
    { 
        base.AgregarEtapa(pFechaIngreso, pEtapa, pUbicacion, pNombreRecibio, out pMensajeError);
        exito = true;
        pMensajeError = ??;
    }

    return exito;
}

我从来没有在覆盖方法中使用过 out 参数,所以我不确定如何声明子方法的 out 参数。我想两个输出参数(child 和 base)应该以相同的方式调用,但我也不确定。

基本上,我需要在子方法中设置 pMensajeError 与基本方法的 out 参数返回的值相同。 这应该如何工作?

删除pMensajeError = ??;

它在调用基本方法时被赋值。

但是,所有代码路径都必须导致它被分配,当 seHace 为 false 时也必须被分配。可以在else语句中赋值吗?

不,您不需要设置pMensajeError = ??;,至少不需要在您放置它的那一行。 pMensajeError 已通过调用 base.AgregarEtapa 设置。如果你真的想给它一个不同的值,你可以重新分配,但如果你想使用基础 class 实现设置的值,你不需要做任何特殊的事情。

您唯一需要记住的是,您对 base.AgregarEtapa 的调用出现在 if 块中。您需要考虑当 if 条件为假且 base.AgregarEtapa 永远不会被调用时您想做什么。

这可能看起来像这样:

if (seHace)
{ 
    base.AgregarEtapa(pFechaIngreso, pEtapa, pUbicacion, pNombreRecibio, out pMensajeError);
    exito = true;
}
else
{
    pMensajeError = ??;
}

return exito;