Клон в строителях Производные классы - PullRequest
1 голос
/ 15 июня 2019

У меня есть класс Compte и CompteCarnet, который наследуется от Compte:

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 голосов
/ 15 июня 2019

Вам необходимо определить (скопировать) конструктор для 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, будет отражено в c2.propCompte.Если вам это не нужно, Client также нужен конструктор копирования, а строку

propCompte = compte.propCompte;

следует изменить на

propCompte = new Client(compte.propCompte);

Стиль кода

Это в сторонеХорошим стилем является использование свойств вместо полей, которые предлагают несколько преимуществ вдоль дороги.Также ваши поля / свойства должны быть общедоступными, иначе вы не сможете получить к ним доступ за пределами Compte или его производных, например CompteCarnet.Незначительный придирка в том, что повторяющиеся compte кажутся избыточными, потому что они принадлежат классу, называемому compte, и, следовательно, по определению относятся только к compte.

В целом, лучший стиль будет выглядеть так:

public abstract class Compte
{
  public int Num { get; set; } // an auto-property
  public DateTime Date { get; set; }
  public float Solde { get; set; }
  public Client Prop { get; set; }

  protected Compte(Compte compte)
  {
    Num = compte.Num;
    Date = compte.Date;
    Solde = compte.Solde;
    Prop = compte.Prop;
  }
}
0 голосов
/ 15 июня 2019

Ваш конструктор не может делегировать конструктору в базовом классе, потому что базовый класс не имеет конструктора (который принимает этот тип).

Кажется, вы пытаетесь реализовать конструктор копирования. Что вы можете сделать, это следующее:

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;

    }
}

Совет от меня будет держать ваш исходный код на английском языке. Это соответствует большинству рекомендаций, которые вы найдете, и это означает, что каждый может понять, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...