【问题标题】:Can not access derived class fields using base class无法使用基类访问派生类字段
【发布时间】:2013-08-16 20:30:11
【问题描述】:

我无法从派生类访问简单字段,那又如何 是在字段的情况下使用多态性。如果我必须向下转换到 ResponseMBP 以获取 Name 属性,那么我的客户需要了解派生类。

那么多态性只对方法有效吗?

public abstract class Response
{
}

public class ResponseMbp : Response
{        
    public string Name = "My Name";        
}

class Program
{
    static void Main(string[] args)
    {
        Response r = new ResponseMbp();
        Console.Write(r.Name);
    }
}

【问题讨论】:

  • 您并没有向 ResponseMBP 转型,而是向它转型。如果你有一个基类引用,你当然不能访问派生类的成员。
  • @Michael,感谢您的回复。您确定要“向上转型”吗?如果我必须使用 ((ResponseMBP)Response).Name 这意味着它正在向下转换,不是吗?看看这个stackoverflow.com/questions/1524197/downcast-and-upcast

标签: c# oop inheritance polymorphism ooad


【解决方案1】:

首先对于字段多态,您应该在基类和派生类中声明该字段(就像方法多态一样)。

现在在您的示例中,字段“name”只是派生类签名的一部分,并且您的基类签名中没有“name”变量。因此,基类的对象虽然是用派生类实例化的,但只会向您显示基类签名项。 因此,由于这个原因,您无法在示例中使用 r.name。

要了解字段多态的正确用法,请参阅this 链接。

【讨论】:

    【解决方案2】:

    ResponseMbp 继承自 Response。所以ResponseMbpResponse,但Response 不是ResponseMbp

    由于您在ResponseMbp 中定义属性NameResponse 不知道或关心它。

    如果您在Response 中定义了NameResponseMbp 将继承该属性,并且可以从任一类访问它。

    【讨论】:

      【解决方案3】:

      您将变量定义为Response 类型。此时您只能访问包含在Response 类及其超类中的属性和变量。

      当属性名为 name 时,您还尝试引用 Name

      【讨论】:

        猜你喜欢
        • 2015-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-28
        • 1970-01-01
        • 2014-06-22
        • 2014-03-13
        相关资源
        最近更新 更多