我有一个Compte类,以及从Compte派生的CompteCarnet:
public abstract class Compte
{
protected int numCompte;
protected DateTime dateCompte;
protected float soldeCompte;
protected Client propCompte;
}
在另一堂课上我这样做:
class CompteCarnet : Compte
{
private float tauxInteret;
//Constructeur by copy
public CompteCarnet(CompteCarnet ca)
{
this.tauxInteret = ca.tauxInteret;
}
}
如果该构造函数是正确的 预先感谢
答案 0 :(得分:0)
您需要为Compte
定义一个(复制)构造函数,该构造函数接受一个Compte
参数,然后使用该参数中的值填充其自身的每个值。
public abstract class Compte
{
protected int numCompte;
protected DateTime dateCompte;
protected float soldeCompte;
protected Client propCompte;
// constructors of abstract classes are always protected, because abstract class can't be instantiated themselves and their constructors are only usable for sub-classes
protected Compte(Compte compte)
{
numCompte = compte.numCompte;
dateCompte = compte.dateCompte;
soldeCompte = compte.soldeCompte;
propCompte = compte.propCompte;
}
}
CompteCarnet
可以保留原样,因为它已经具有适当的复制构造函数。
请注意,如果Client
是使用上述方法复制参考的类。这意味着如果您拥有CompteCarnet c1
并执行var c2 = new CompteCarnet(c1);
,则c1和c2将具有完全相同的propCompte
对象,并且您对c1.propCompte
的内容所做的任何更改都将反映在{ {1}}。如果您不希望这样做,c2.propCompte
还需要一个复制构造函数和一行
Client
应更改为
propCompte = compte.propCompte;
此外,一种好的样式是使用属性而不是字段,这在使用过程中具有许多优点。另外,您的字段/属性可能应该是公共的,否则您将无法访问propCompte = new Client(compte.propCompte);
之外的字段或Compte
之类的内容。一个次要的选择是重复compte似乎是多余的,因为它们来自称为compte的类,因此从定义上讲仅与compte有关。
总的来说,更好的样式是:
CompteCarnet
答案 1 :(得分:-1)
您的构造函数无法委托给基类中的构造函数,因为基类没有构造函数(接受该类型)。
似乎您正在尝试实现一个复制构造函数。 您可以执行以下操作:
class CompteCarnet: Compte {
private float tauxInteret;
public CompteCarnet(Compte ca) {
if (ca is CompteCarnet derived)
this.tauxInteret = derived.tauxInteret;
numCompte = ca.numCompte;
dateCompte = ca.dateCompte;
soldeCompte = ca.soldeCompte;
propCompte = ca.propCompte;
}
}
我的一个建议是将您的源代码保留为英语。 这遵循您会发现的大多数准则,这意味着每个人都可以理解您要尝试执行的操作。