我有一个父类Customer,该类有3个properties
**
CID,Bal,Cname
**
我有一个具有1个属性Stats的子类。现在,我想通过静态void main将值从子类构造函数提供给父类constructor
。
我想为父类构造函数提供值仅来自基类。
我的代码在
static void Main(string[] args)
{
Stat s1 = new Stat(false);//want to provide value to base class constructor from here only.
}
}
class Customer
{
int _Cid, _Bal;
string _Cname;
public int CID
{
get
{
return _Cid;
}
set
{
_Cid= value;
}
}
public int Bal
{
get
{
return _Bal;
}
set
{
_Bal = value;
}
}
public string Cname
{
get
{
return _Cname;
}
set
{
_Cname = value;
}
}
public Customer(int _Cid,int _Bal,String _Cname)
{
this._Cid=_Cid;
this._Cname = _Cname;
this._Bal = _Bal;
}
}
class Stat:Customer
{
bool _Status;
public bool Stats
{
get
{
return _Status;
}
set
{
_Status= value;
}
}
public void display()
{
}
public Stat(bool _Status):base(int _Cid, int _Bal, String _Cname) //child class constructor how can i supply value to parent class constructor.
{
this._Status = _Status;
}
}
答案 0 :(得分:2)
您的基类构造函数是这个:
public Customer(int _Cid,int _Bal,String _Cname)
您派生的类构造函数是这个:
public Stat(bool _Status)
在C#中,当实例化派生类时,必须调用基类。在基类只有一个无参数构造函数的情况下,这是在派生类构造函数主体执行之前隐式完成的。如果基类没有无参数的构造函数,则必须使用base
显式调用它。
以这个例子为例:
public enum MyEnum
{
Person,
Animal,
Derived
}
public class Base
{
public Base(MyEnum classType)
{
}
}
public class Person : Base
{
}
有两种方法可以执行此操作:接受Person
的参数并将其传递给基本构造函数:
public class Person : Base
{
public Person(MyEnum classType) : base(classType)
{
// this will be executed after the base constructor completes
}
}
或通过对值进行硬编码(假设MyEnum包含值Person
):
public class Person : Base
{
public Person() : base(MyEnum.Person)
{
// this will be executed after the base constructor completes
}
}
请注意,您可以具有多个构造函数,因此,如果派生类使用某些默认值实例化值,则可以定义另一个protected
构造函数以供派生类使用。 protected
确保只能由派生类调用,而不能由任何调用new Base(...)
的人调用:
public class Base
{
private readonly MyEnum _classType;
public Base(MyEnum classType)
{
_classType = classType;
}
protected Base()
{
_classType = classType.Derived;
}
}
public class Person : Base
{
public Person() : base()
{
// this will be executed after the base constructor completes
}
}
基类和派生类中的参数数量之间没有关系。仅存在一个简单的要求:派生构造函数必须调用(并满足任何参数要求)其基类构造函数,其中基类构造函数接受参数,或者有多个。
在您的特定示例中,您可能打算这样做:
public Stat(bool _Status, int _Cid, int _Bal, String _Cname) : base(_Cid, _Bal, _Cname)
请注意,命名参数_Cid
有点奇怪。前缀_
通常表示它是类中的私有字段。普通的C#约定对方法参数使用驼峰式(camelCaseArgumentName
)。