如何从C#中的子构造函数调用父构造函数

时间:2012-07-30 14:19:36

标签: c# class inheritance parent

我试图从我的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命令,但它永远不会有效。

请帮助!!!

------------ ---------------- UPDATE

问题解决了。

感谢所有帮助和建议

5 个答案:

答案 0 :(得分:4)

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

只需向其添加修饰符,例如publicprotectedinternal

protected Person(

然后你可以正常调用base

public Resident() 
    : base() 
{
}

答案 1 :(得分:3)

  

我已尝试过base命令,但它永远不会有效。

这不是一个“命令”,但绝对有效:

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

不可否认,目前还不清楚你在这里传递了什么,因为你的参数似乎都没有显示出姓名或地址等等......也许你需要添加更多参数?

编辑:同样如Adam所述,除非PersonResident内被声明为嵌套类型,否则您需要提高Person构造函数的可见性。如果您只需要在Resident的程序文本中调用它,那么Resident构造函数就可以保持私有状态,但您更有可能希望提高其可见性。

(作为旁注,那些参数名称很糟糕 - 为什么用a作为前缀?)

答案 2 :(得分:0)

如果你想让它的访问权限公开,你应该为构造函数添加public关键字:

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

如果他们在同一个项目上,你也可以使用internal,或protected,因为一个是另一个的基础,等等,但这一切都取决于你真正想要访问的修饰符对于ctor来说。

默认访问修饰符为private,它不允许该类访问外部的任何内容。

答案 3 :(得分:0)

在我看来,这应该有效:

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(...)

亲切的问候,亲

答案 4 :(得分:0)

在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)
{

}
相关问题