0

我正在努力做到这一点:

class A { 
   //attibutes
}

class B : A {
   public int classBAttribute = 5;
   // other attributes and methods
}

我的问题是,如果我有 A 类的实例,我如何获取 B 类的实例或访问他的属性?

B b = new B();
Application.Add(b);

//other form
A a = Application.GetA();
B b = getBFromA(a);// ???  Note:  B b = a as B; does't work i tried
4

3 回答 3

1

我的问题是,如果我有 A 类的实例,我如何获取 B 类的实例或访问他的属性?

您的程序如何知道 A 的实例实际上是 B 类型?

B 的实例可以用作 A(因为 B 是 A 的特化),但相反的情况是不可能的。

于 2013-07-24T08:38:10.540 回答
1

你不能这样做——一般来说,没有神奇的方法可以从基础对象创建派生对象。

要启用这样的方案类B,需要定义一个接受A参数的构造函数:

public B(A a)
{
    // do whatever makes sense to create a B from an A
}

然后您可以将其用作

var b = new B(a);

当然在这之后a又会b是完全不同的对象;改变一个不会影响另一个。

您还应该正确使用术语以避免混淆:classBAttribute不是属性,而是字段

于 2013-07-24T08:38:19.727 回答
1

也许我不完全理解问题或答案,但是......

将 a转换A为 aB 应该有效(只要Aa 实际上是(也) a B)。

A a = Application.GetA();
if(a is B)
{
    B b = (B)a;
    DoSomething(b.classBAttribute);
}
else
{
    // TODO: Some fallback strategy or exception (?)
}
于 2013-07-24T09:23:19.457 回答