【问题标题】:How to override a Base Class method and add a parameter如何覆盖基类方法并添加参数
【发布时间】:2009-03-11 14:57:00
【问题描述】:

我的基类中有这个:

protected abstract XmlDocument CreateRequestXML();

我尝试在派生类中覆盖它:

protected override XmlDocument CreateRequestXML(int somevalue)
{
    ...rest of code
}

我知道这是一个简单的问题,但是因为我已经引入了一个参数,所以这就是问题所在吗?问题是,一些派生类在其实现中可能有也可能没有参数。

【问题讨论】:

    标签: c# architecture


    【解决方案1】:

    当您重写一个方法时,除了单词 override 代替 virtual 或 abstract 之外,它必须具有与原始方法完全相同的签名。

    您在这里所做的是创建一个新的不相关方法。不可能引入参数并仍然覆盖。

    【讨论】:

    • 好的,那么假设您要确保每个类都继承此基类以实现该方法。但是您知道,在某些情况下,该方法会有一些传入的必需参数,而有些则没有。然后呢?您不需要参数并通过 priv 字段获取它们吗?
    • 因此,您希望子类实现受保护的方法,并且在某些子类中您有时需要参数,因为 as 依赖于它们,而在其他情况下可能不依赖。如果该方法不打算公开使用,您可以从班级的私人成员那里获得......这是典型的吗?
    • 我只是想弄清楚(最佳实践)何时最好让受保护甚至私有方法无参数,而只是从私有字段中获取它需要的东西
    【解决方案2】:

    如果有些派生类需要参数而有些不需要,则需要有两个方法的重载版本。然后每个派生类都可以覆盖它需要的类。

    class Foo {    
        protected abstract XmlDocument CreateRequestXML(int somevalue);
        protected abstract XmlDocument CreateRequestXML();
    };
    
    class Bar : public Foo {    
        protected override XmlDocument CreateRequestXML(int somevalue) { ... };
        protected override XmlDocument CreateRequestXML()
            { CreateRequestXML(defaultInt); }
    };
    

    这当然会引入用户调用错误的问题。如果额外的参数没有可接受的默认值,如果调用了错误的版本,您可能不得不在派生类中抛出异常。

    【讨论】:

      【解决方案3】:

      是的,参数是问​​题,方法签名必须完全匹配(包括返回值和参数)。

      【讨论】:

        【解决方案4】:

        我很好奇你想用这段代码完成什么。

        通常,当使用类知道其签名时,您会定义一个抽象函数。使用类与您的基类有“合同”。

        当您想从基类派生并添加其他参数时,使用类如何知道在基类上调用什么?

        这看起来像是架构上的缺陷......但也许你可以在初始主题中添加一些额外的信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-01
          • 1970-01-01
          • 2011-05-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多