【问题标题】:C# Get subclass attribute valueC#获取子类属性值
【发布时间】:2013-07-24 08:34:04
【问题描述】:

我正在尝试这样做:

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

【问题讨论】:

  • 好吧。您不能将 A 向上转换为 B。很简单。
  • 另外,为了将来参考 - 您所指的属性称为类成员。 .NET 语言中的属性是完全不同的东西。 =)
  • 好吧,我不知道正确的概念,我更像是一个算法专家:)
  • 这就是为什么我要指出它以供未来参考。我不是在责备。 =)

标签: c# oop inheritance polymorphism


【解决方案1】:

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

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

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

然后你可以用作

var b = new B(a);

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

您还应该正确使用术语以避免混淆:classBAttribute 不是attribute,而是field

【讨论】:

  • 好吧,我想我必须使用数据库,因为没有数据库我无法从 A 获取 B。谢谢您的回答。
【解决方案2】:

我的问题是,如果我有一个 A 类的实例,我该如何获得 B类的实例还是访问他的属性?

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

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

【讨论】:

  • 这就是为什么我想知道它是否可能:)。谢谢你的回答。
【解决方案3】:

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

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

A a = Application.GetA();
if(a is B)
{
    B b = (B)a;
    DoSomething(b.classBAttribute);
}
else
{
    // TODO: Some fallback strategy or exception (?)
}

【讨论】:

  • 我试图让他没有工作 B 的自定义字段不是从 A 继承的
  • @AntonioPapa 将对象投射到 B 后,您就可以访问该字段。 “没用”是什么意思?
  • 表示b为空
  • 当我将 a 转换为 b 时返回的值
猜你喜欢
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多