自动将对象扩展到某个继承类

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的回答中,我提到了花车,但实际上是指实数(数学术语).这是因为我的英语相当不完美.请停止挑选它.:]

谢谢

我要感谢大家的回答.我决定给史蒂夫一笔赏金,但这并不意味着我认为问题已经结束了.我仍在寻找反对自动对象转换的论据.我必须管理员,我感到有点失望,那些最警告我的人无法提供与转换相关的明确例子(与投票无关).

从我自己的研究,我决定注意到了在一个单独的答案几件事情(如果有人可以找到它们有用).请随时编辑和扩展列表.

Dav*_*d W 5

没有!从类的基本描述来看,ClassA 不是 ClassB.您描述的关系不是对称/反身的.可以这样想:每把锤子都是一把工具,但不是每一把锤子都是锤子.如果你需要拧一个螺丝,你需要一个工具,但锤子不能完成这项工作.用这个类比替换上面的类定义,我认为它的关系不清楚为什么关系不起作用.

  • @KubaWyrostek没有整数也是浮点数.编译器只需在必要时插入转换逻辑.如果您希望类之间的关系具有相同的效果,则定义隐式转换运算符方法. (3认同)
  • @Kuba,每个整数都是浮点数?你需要回去并忘掉一些东西.地图不是领土 (3认同)
  • 只有在C#中继承的解决方案是一个明确的演员,这就是我们一直在努力的原因.它不需要详细说明,我拒绝将其作为我的名字的答案,它不是答案.这是一个充满了你尚未遇到的可怕问题的包. (2认同)