【问题标题】:superclass storing a subclass [closed]存储子类的超类[关闭]
【发布时间】:2013-11-02 04:38:31
【问题描述】:

我知道超类可以存储子类的实例,

例如:

public class Subclass
{
   private int color;

   public Subclass()
   {
     color = "red";
   }
}

Superclass v = new Subclass();

超类不知道子类中的方法、变量等, 但是投射它,让你可以访问这些。

它是如何工作的?

示例:

Vechicle v = new Car();
Car c = (Car) v;
Consoel.WriteLine(c.color);


Output:
red

【问题讨论】:

  • 每个对象实例都有一个具体类型。其他所有内容都是应用于此类型的(兼容的)“视图”,Car 的演员表不会爆炸 - 它总是是一辆汽车!现在,由于 non-virtual 方法和 non-virtual 运算符,这些视图可能会造成一些破坏(阅读:多态性不按预期运行)......但是本身就是一个完整的讨论!
  • @user2864740,您的术语对于 C# 程序员来说非常特殊。 (“view”?“explode”?)非虚方法和“非虚操作符”(!?)有什么关系?
  • @LaggKing,请仅发布您已编译的代码。 “子类 m”是严重非法的。
  • @KirkWoll 非虚拟方法根据“视图”(或“接收者”的 表达式 的类型(或根据调用成员(或点左侧的成员)))。我指出操作员是非虚拟的,因此遭受同样的命运。 “Explode”是口语化的,专门指 InvalidCastException(或非编译程序)。

标签: c# inheritance


【解决方案1】:

没有你说的那么简单。

如果Car 的构造函数中的颜色发生变化,它将不同于红色。

还有virtual methods的概念。

跟随不是继承,而是强制转换。 Inheritance msdn

Car c = (Car) v;

所有继承的类型都可以类型转换为基类型,但这不是必需的。 此外,还可以有用户定义的转换,以及使用助手类的转换。
Casting and Type Conversion - MSDN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 2017-04-19
    • 2014-01-07
    • 1970-01-01
    • 2012-07-05
    • 2018-09-09
    • 2017-08-30
    相关资源
    最近更新 更多