【发布时间】:2012-08-27 05:47:20
【问题描述】:
假设我有以下声明:
public class ClassA
{
public string FieldA = "Something first";
}
public class ClassB : ClassA
{
public string FieldB = "Something second";
}
众所周知,ClassB 的对象可以在需要ClassA 的每个地方使用。例如一个方法
public void DoSthWithObject(ClassA a);
可以这样调用:
ClassB b = new ClassB();
DoSthWithObject(b);
也可以将继承的类型转换为父类型:
ClassA a = (b as ClassA);
所以编译器/框架知道如何“使用”ClassB 的数据,其中需要ClassA。
现在的问题是:有可能以某种方式反过来吗?假设我有一个ClassA 类型的变量,我想开始使用它作为ClassB但同时保留ClassB 继承自ClassA 的所有字段并且不实例化新对象?我知道这需要扩展为ClassA 的对象分配的内存以容纳ClassB 的字段。
简单来说我想做这样的事情:
ClassA a = new ClassA();
ClassB b = (a as ClassB); // some magic happens here
(我知道我可以实现IConvertible 并使用Convert 或提供一些克隆机制,但我想避免这样的解决方案。)
编辑
由于答案似乎集中在提出替代解决方案或警告我什至想按照我的意愿去做,我决定稍微改变我的问题并提出赏金,这样也许我可以获得更好的答案。
首先,我希望它与语言无关。
第二:我真的确实明白,不是每个工具都是锤子,我可以(我希望)区分 Jack 和 简。我也不需要关于基本 OOP 的课程(除非有人能证明我犯了一个基本的概念错误,而我目前显然没有意识到)。我想知道的是如果以及为什么自动父类到子类的转换在逻辑上是不可能的,以及它是否可能(从 cmets 看来,有些语言是这样的 em> 可能)然后为什么它很危险/充满缺陷。这也是非常有趣的,它实际上是如何用这些语言在技术上完成的,“支持”它(或至少不禁止它)。
但我确实期待真正的编程示例,而不仅仅是隐喻。
明确一点:我不是在寻找有关向下转换先前向上转换的对象的信息。这不是这里的情况。
如果我是一个希望同时在同一个表列上聚合和分组的人 - 请告诉我这个。我知道我很聪明,可以理解。 :-) 我只是不想让这个问题留下一种我没有理解的关于 OOP 的基本知识。
通知
在大卫回答下的评论中,我提到了 浮点数,但实际上指的是 实数(数学术语)。这是因为我的英语不太好。请停止挑剔。 :]
谢谢
我要感谢大家的回答。我决定悬赏史蒂夫,但这并不意味着我认为这个问题已经结束。我仍在寻找反对自动对象转换的论据。我必须管理的是,我对那些警告我最多的人无法提供与转换相关(而不是与演员表相关)的明确示例感到有点失望。
根据我自己的研究,我决定在单独的答案中注明一些事情(以防有人发现它们有用)。请随时编辑和扩展列表。
【问题讨论】:
-
这只是一种好奇心。但它来自多层服务,其中每一层都需要在将对象传递给底层之前向对象添加一些信息。我希望每一层都使用各自的继承层次结构(以避免传递空字段)。
-
然后使用多个接口...或组合。
-
谢谢,我现在正在使用合成。我只是想知道不同的解决方案。
标签: oop inheritance casting