Вам необходимо определить (скопировать) конструктор для 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;
}
}