首页 > 解决方案 > 使用从单个参数派生的两个参数调用基本构造函数

问题描述

我有一个基类,它的构造函数中有两个参数:

public class BaseClass {
    public BaseClass(string key, object value) { ... }
}

我的派生类的构造方式不同,使用单个复杂参数,然后我可以将其拆分为基类参数。

public class DerivedClass : BaseClass {
    public DerivedClass (string keyValuePair)
        : BaseClass( SomethingExpensive(keyValuePair).Key,
                     SomethingExpensive(keyValuePair).Value) { }

    private static KeyValuePair<string,object> SomethingExpensive(string input) { 
         // Do expensive things
         return new KeyValuePair<string,object>(derivedKey, derivedValue);
    }    
}

鉴于我无法控制BaseClass并且不能给它一个新的构造函数,我试图找到任何方法来传递这些参数而无需调用SomethingExpensive两次。


我考虑过out在第一次调用期间使用参数为其他构造函数参数生成一个新标识符:

public class DerivedClass : BaseClass {
    public DerivedClass (string keyValuePair)
        : BaseClass( SomethingExpensive(keyValuePair, out object _value), _value) { }

    private static string SomethingExpensive(string input, out object value) { 
         // Do expensive things
         value = derivedValue;
         return derivedKey;
    }    
}

但这在当前框架中被拒绝并出现错误:

错误 CS8107 功能“在成员初始化程序和查询中声明表达式变量”在 C# 7.0 中不可用。请使用 7.3 或更高版本的语言。

有什么替代的想法吗?

标签: c#.netconstructorinitialization

解决方案


我可以想到两种不同的方法,尽管不是彻底的解决方案:

  1. 可以缓存解析键值对的结果,这样第2次调用就不贵了
  2. 您可以使用 has-a 而不是 is-a 关系模型。这样基类就不是派生的,而是一个包含的对象,由同一个接口包装和公开。

希望这可以帮助。


推荐阅读