【问题标题】:How to write one method in base class if method uses different types depending on the derived class?如果方法根据派生类使用不同的类型,如何在基类中编写一种方法?
【发布时间】:2014-09-04 00:52:22
【问题描述】:

这个问题听起来比实际上要复杂。我在下面有一个简化的例子。粉红色突出显示两个类别之间的差异。如您所见,唯一真正的区别在于使用的枚举类型。所有其他代码都是相同的。有没有办法使用继承和/或模板在我的整个代码库中只有一个 GetTrialType() 方法?我在这个例子中展示了两个派生类(NBACK 和 COLOR),但实际上有数百个派生自 Task 类的类。这意味着如果我必须对 GetTrialType() 方法进行一次更改,我实际上将不得不进行 100 次更新。我怎样才能防止这种情况(当使用不同的类型时)?

【问题讨论】:

  • 您的代码是如何工作的? trialTypes(trial) 怎么知道返回什么类型?
  • 当两者的选项相同时,为什么要为枚举提供差异名称?
  • @Zache:希望了解更多关于您的解决方案的信息。基类是否允许您使用模板类型创建成员变量?它是否允许您创建未在基类中实现但仅在派生类中实现的方法?
  • @nvoigt: trialTypes[trial] 只是一个 Dictionary,它是派生类的私有成员变量。
  • @Patel:有时他们有不同的选择。有时它们具有相同的选项,但值不同。

标签: c# templates inheritance types enums


【解决方案1】:

您可以简单地使用 int 而不是该字典中的枚举。在派生类中,每次将任何类型添加到 trialTypes 时,都必须将其强制转换为 int,而每次通过调用 GetTrialType 获取类型时,都必须将其强制转换回枚举类型。在您的 Task 类中,您可以:

    private Dictionary<int, int> trialTypes;

    protected int GetTrialType(int trial)
    {
        try
        {
            return trialTypes[trial];
        }
        catch (Exception ex)
        {
            // your logging ...
        }

        return 0;
    }

    protected void AddTrialType(int trial, int type)
    {
        trialTypes.Add(trial, type);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 2021-07-18
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    相关资源
    最近更新 更多