c# - 使用从单个参数派生的两个参数调用基本构造函数
问题描述
我有一个基类,它的构造函数中有两个参数:
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 或更高版本的语言。
有什么替代的想法吗?
解决方案
我可以想到两种不同的方法,尽管不是彻底的解决方案:
- 可以缓存解析键值对的结果,这样第2次调用就不贵了
- 您可以使用 has-a 而不是 is-a 关系模型。这样基类就不是派生的,而是一个包含的对象,由同一个接口包装和公开。
希望这可以帮助。
推荐阅读
- mysql - 查询有多少用户在线不工作
- java - 不正确的资源访问授权 - Checkmarx -Java
- xml - XmlStarlet 更新第一个节点的值
- arrays - 如何删除Julia中n维数组的特定行?
- r - 与从数据集中移除异常值相关的问题 (R)
- mysql - MySQL 中 IF 子句中的嵌套查询似乎无法按预期工作
- google-cloud-platform - 有没有办法取消存储桶文件夹删除
- vue.js - 使用 Azure AD 时的 VueJS 用户权限
- python - 如何在一行中打印 Python 对象的名称?
- javascript - 当我使用 Apollo 时,对象数组转换为对象对象