Kub*_*tek 4 oop inheritance casting
我们假设我有以下声明:
public class ClassA
{
public string FieldA = "Something first";
}
public class ClassB : ClassA
{
public string FieldB = "Something second";
}
Run Code Online (Sandbox Code Playgroud)
众所周知,对象ClassB可以在每个ClassA需要的地方使用.例如,一种方法
public void DoSthWithObject(ClassA a);
Run Code Online (Sandbox Code Playgroud)
可以像这样调用:
ClassB b = new ClassB();
DoSthWithObject(b);
Run Code Online (Sandbox Code Playgroud)
也可以将继承类型转换为父类型:
ClassA a = (b as ClassA);
Run Code Online (Sandbox Code Playgroud)
所以编译器/框架知道如何"使用"的数据ClassB在那里ClassA是必需的.
而现在的问题是:是否有可能以某种方式反过来做?假设我有一个类型的变量,ClassA我想开始使用它,ClassB但同时保留所有ClassB继承的字段ClassA并且不实例化新对象?据我所知,它需要扩展分配给对象的内存ClassA来容纳字段ClassB.
简单来说,我想做这样的事情:
ClassA a = new ClassA();
ClassB b = (a as ClassB); // some magic happens here
Run Code Online (Sandbox Code Playgroud)
(我知道我可以实现IConvertible和使用Convert或提供一些克隆机制,但我想避免这样的解决方案.)
编辑
由于答案似乎集中在提出替代解决方案或警告我甚至想要按我的意愿去做,我决定稍微改变我的问题并提出赏金,所以也许我可以得到更好的答案.
首先,我希望这与语言无关.
二:我真的不明白,不是每一个工具是一把锤子,我可以(我希望)区分杰克从珍.我也不需要关于基本OOP的课程(除非有人能够证明我正在犯一个基本的概念错误,我现在显然不知道).我想知道的是,如果,为什么是一个自动化的父母到子类的转换逻辑上是不可能的,如果它是可能的(因为它的意见似乎也有语言的地方是可能的),那么为什么它是危险/破绽百出.它是如何在这些语言中实际上技术性地完成,"支持"它(或者至少不禁止它).
但我确实期待真正的编程实例,而不仅仅是隐喻.
只是为了说清楚:我不是在寻找关于向下传播先前升级对象的信息.这不是这种情况.
如果我是一个希望同时在同一个表栏上汇总和分组的人 - 请告诉我.我知道我很聪明,应该明白.:-)我只是不想离开这个问题有一个感觉,有一些是关于面向对象,我不抓根本.
注意
在David的回答中,我提到了花车,但实际上是指实数(数学术语).这是因为我的英语相当不完美.请停止挑选它.:]
谢谢
我要感谢大家的回答.我决定给史蒂夫一笔赏金,但这并不意味着我认为问题已经结束了.我仍在寻找反对自动对象转换的论据.我必须管理员,我感到有点失望,那些最警告我的人无法提供与转换相关的明确例子(与投票无关).
从我自己的研究,我决定注意到了在一个单独的答案几件事情(如果有人可以找到它们有用).请随时编辑和扩展列表.
没有!从类的基本描述来看,ClassA 不是 ClassB.您描述的关系不是对称/反身的.可以这样想:每把锤子都是一把工具,但不是每一把锤子都是锤子.如果你需要拧一个螺丝,你需要一个工具,但锤子不能完成这项工作.用这个类比替换上面的类定义,我认为它的关系不清楚为什么关系不起作用.