克隆构建器派生类

时间:2019-06-15 15:38:06

标签: c# oop

我有一个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;
    }
}

如果该构造函数是正确的 预先感谢

2 个答案:

答案 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可以保留原样,因为它已经具有适当的复制构造函数。

客户端propCompte可能出现的按引用复制问题

请注意,如果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;

    }
}

我的一个建议是将您的源代码保留为英语。 这遵循您会发现的大多数准则,这意味着每个人都可以理解您要尝试执行的操作。