c# - 如何以更动态的方式设置 C# 向下转换
问题描述
如果标题不太对,请见谅。
我有一组我从中派生的基类。有一个主要的和一堆我可以添加到它的组件。
public class Entity {
public EntityPart ep;
}
public class EntityPart {
public void eFunc() {}
}
我的派生类显然非常适合我的所有虚函数。但这是我遇到的问题
public class dEntity : Entity {
public void someFunc() {
ep.derivedFunc(); // Error, does not exist on EntityPart
}
}
public class dEntityPart : EntityPart {
public void derivedFunc() {}
}
我很快就弄清楚发生了什么。由于ep
仍然只是一个EntityPart
它没有派生的功能。
我找到了一个可行的解决方案,但感觉有些不对劲。当我问其他人时,他们似乎对我的代码以前不起作用感到困惑。
public class dEntity : Entity {
public new dEntityPart ep {
get { return (dEntityPart)base.ep; }
}
}
据我了解,这只是声明一个名为ep
type的变量dEntityPart
。这是一个属性,并且具有将base.ep
(只是EntityPart
)转换为dEntityPart
. new
关键字从类中隐藏基。
我想先仔细检查一下这种理解是否正确。
这就像我需要的那样工作,但看起来很乱。我有很多这些类的派生集,每一个都有很多部分。这种方法感觉有点慢和麻烦。有没有办法将这种向下转换设置为始终存在,或者可能有一种方法可以设置一些通用的像这样工作?
如果这是这样做的方法,好吧。我可能对设置此类代码的更优雅的方法或更好的方法感兴趣。谢谢!
解决方案
这对你有用吗?
public class Entity<T> where T : EntityPart {
public T ep;
}
public class EntityPart {
public void eFunc() {}
}
public class dEntity : Entity<dEntityPart> {
public void someFunc() {
ep.derivedFunc(); // This won't throw an error anymore.
}
}
public class dEntityPart : EntityPart {
public void derivedFunc() {}
}
推荐阅读
- python - Pyperclip 1.8.2 与 Pyautogui 冲突
- python-3.x - 虚拟麦克风中的音频已饱和
- html - 从 Ilustrator 导入 SVG 不会产生清晰的线条
- apache-spark - Spark 3.1 在 Java 中加入两个数据集
- ruby-on-rails - 为什么 WSL2/Ubuntu 上的密钥可以打开凭证文件,但在另一台机器/服务器上却没有?
- java - 使用 @SpringConfigureMockMvc 和 Hibernate 方言的意外行为
- python - 有没有办法在python中调用多个同名文件来合并一个
- r - R:了解“makePSOCKcluster”的影响
- python - 如何从 URL 而不是文件对图像进行 base64 编码?
- signal-processing - 过滤具有可变和漂移基线的噪声信号