我有一个基类,它的构造函数有两个参数:
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;
}
}
但这在当前框架中被拒绝并出现错误:
Error CS8107 Feature 'declaration of expression variables in member initializers and queries' is not available in C# 7.0. Please use language version 7.3 or greater.
还有其他想法吗?
最佳答案
我可以想到 2 种不同的方法,尽管不是彻底的解决方案:
- 可以把键值对的解析结果缓存起来,这样第二次调用就不会很昂贵了
- 您可以使用 has-a 而不是 is-a 关系模型。这样基类就不是派生的,而是一个包含的对象,由同一个接口(interface)包装和暴露。
希望这对您有所帮助。
关于c# - 使用从单个参数派生的两个参数调用基本构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54815212/