【问题标题】:How to call a parent constructor from a child constructor in C#如何在 C# 中从子构造函数调用父构造函数
【发布时间】:2012-07-30 14:19:35
【问题描述】:

我正在尝试从我的 Resident 类调用我的 Person 类构造函数

人:

public class Person
{
    private String name;
    private String surname;
    private String address1;
    private String address2;
    private String telephone;
    private String faxNumber;

    Person(String aName, String aSurname, String aAddress1, String aAddress2, String aTelephone, String aFaxNumber)
    {
        name = aName;
        surname = aSurname;
        address1 = aAddress1;
        address2 = aAddress2;
        telephone = aTelephone;
        faxNumber = aFaxNumber;
    }

居民:

public class Resident : Person
{
    private String IDNumberPrim;
    private String IDNumberSec1;
    private String IDNumberSec2;
    private String IDNumberSec3;
    private String IDNumberSec4;
    private String tempID;
    private String passportNumber;


    Resident(String aIDNumberPrim, String aIDNumberSec1, String aIDNumberSec2, String aIDNumberSec3, String aIDNumberSec4, String aTempId, String aPassportNumber)

我已经尝试过基本命令,但它始终不起作用。

请帮忙!!!

------------更新----

问题解决了。

感谢所有帮助和建议

【问题讨论】:

  • 为什么不起作用?它说什么?
  • 除了回答当它不起作用时会发生什么的问题外,请显示您尝试base失败的代码,以便我们告诉您它有什么问题。

标签: c# class inheritance parent


【解决方案1】:

目前,您的构造函数都默认为private,因为您没有包含access modifier。如果Person 构造函数是私有的并且Resident 类是独立的(即,正如Jon Skeet 解释的那样,没有嵌套在Person 中),即使它是从它继承的,它也不具有构造函数的可见性。

只需为它们添加一个修饰符,例如 publicprotectedinternal

protected Person(

然后你可以像往常一样拨打base

public Resident() 
    : base() 
{
}

【讨论】:

  • 好的,我现在已经按照您的建议编辑了代码,但是现在 base() 中的每个参数都给出了错误消息:“名称 'xxx' 在当前上下文中不存在。 "其中 xxx 被替换为适当的参数。
【解决方案2】:

我已经尝试了基本命令,但它永远无法工作。

这不是一个真正的“命令”,但它确实有效:

Resident(String aIDNumberPrim, String aIDNumberSec1,String aIDNumberSec2,
         String aIDNumberSec3, String aIDNumberSec4, String aTempId,
         String aPassportNumber)
    : base(...)
{
}

诚然,目前尚不清楚您将在此处传递什么,因为您的参数似乎都没有表示名称或地址等...也许您需要添加更多参数?

编辑:也正如 Adam 所指出的,您需要增加 Person 构造函数的可见性,除非 ResidentPerson 中声明为嵌套类型。如果您只需要在 Resident 的程序文本中调用 Resident 构造函数,保持私有状态是可以的,但您更有可能也希望增加它的可见性。

(顺便说一句,这些参数名称很糟糕 - 为什么要在所有内容前加上 a?)

【讨论】:

    【解决方案3】:

    如果你希望它的访问是公开的,你应该为构造函数添加public关键字:

    public Person(String aName, String aSurname, String aAddress1,
                  String aAddress2, String aTelephone, String aFaxNumber)
    {
        ...
    }
    

    如果它们在同一个项目中,您也可以使用internal,或者protected,因为其中一个是另一个的基础,等等,但这一切都取决于您真正想要为 ctor 访问修饰符的内容是。

    默认访问修饰符是private,它不允许该类外部的任何东西访问它。

    【讨论】:

      【解决方案4】:

      在我看来,这应该可行:

      public class Person
      {
          private String name;
          private String surname;
          private String address1;
          private String address2;
          private String telephone;
          private String faxNumber;
      
          public Person(String aName, String aSurname, String aAddress1, String aAddress2, String aTelephone, String aFaxNumber)
          {
              name = aName;
              surname = aSurname;
              address1 = aAddress1;
              address2 = aAddress2;
              telephone = aTelephone;
              faxNumber = aFaxNumber;
          }
      
      public class Resident : Person
      {
          private String IDNumberPrim;
          private String IDNumberSec1;
          private String IDNumberSec2;
          private String IDNumberSec3;
          private String IDNumberSec4;
          private String tempID;
          private String passportNumber;
      
      
          Resident(String aIDNumberPrim, String aIDNumberSec1, String aIDNumberSec2, String aIDNumberSec3, String aIDNumberSec4, String aTempId, String aPassportNumber) : base(...)
      

      亲切的问候,亲

      【讨论】:

        【解决方案5】:

        在 Resident 的构造函数参数列表中的右括号之后,尝试在大括号前说 ': Person(...)',在 '...' 中提供适当的参数:

        Resident(String aName, String aSurname, String aAddress1, String aAddress2, String aTelephone, String aFaxNumber,
            String aIDNumberPrim, String aIDNumberSec1, String aIDNumberSec2, String aIDNumberSec3, String aIDNumberSec4, String aTempId, String aPassportNumber) 
        : Person (aName, aSurname, aAddress1, aAddress2, aTelephone, aFaxNumber)
        {
        
        }
        

        【讨论】:

          猜你喜欢
          • 2018-01-31
          • 1970-01-01
          • 2018-05-25
          • 1970-01-01
          • 2011-03-06
          • 1970-01-01
          • 2018-02-28
          • 2017-09-28
          • 1970-01-01
          相关资源
          最近更新 更多