假设我有以下声明:
public class ClassA
{
public string FieldA = "Something first";
}
public class ClassB : ClassA
{
public string FieldB = "Something second";
}
众所周知,objectClassB
可以在任何需要的地方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和Jane区分开来。我也不需要关于基本 OOP 的课程(除非有人实际上可以证明我犯了一个基本的概念错误,而我目前显然没有意识到这一点)。我想知道的是,自动父类到子类的转换是否以及为什么在逻辑上是不可能的,如果它是可能的(从评论看来,有可能的语言)那么为什么它是危险的/充满缺陷。这也是非常有趣的,它实际上是如何用这些语言在技术上完成的,“支持”它(或者至少不禁止它)。
但我确实期待真正的编程示例,而不仅仅是隐喻。
只是为了说清楚:我不是在寻找有关向下转换先前向上转换的对象的信息。这不是这里的情况。
如果我是一个希望在同一个表列上同时聚合和分组的人 - 请给我看这个。我知道我很聪明,可以理解。:-) 我只是不想让这个问题留下我没有理解的关于 OOP 的基本内容的感觉。
注意
在大卫的回答下的评论中,我提到了浮点数,但实际上指的是实数(数学术语)。这是因为我的英语不太好。请停止挑剔。:]
谢谢你
我要感谢大家的回答。我决定悬赏史蒂夫,但这并不意味着我认为这个问题已经结束。我仍在寻找反对自动对象转换的论据。我必须管理,我感到有点失望的是,那些警告我最多的人无法提供与转换相关的明确示例(与铸造无关)。
根据我自己的研究,我决定在单独的答案中指出一些事情(以防有人发现它们有用)。请随时编辑和扩展列表。