2015-04-28 2 views
1

У меня есть класс Father и унаследованный класс Child. Внутри конструктора Child я хочу передать класс Father, чтобы отбросить все свойства Отца.Подкласс класса отца от дочернего класса

Это мой код

class Father 
{ 
    int prop1; 
    int prop2; 
    // many more properties; 
} 

class Child : Father 
{ 
    string _name; 
    int _age; 
    //etc... 

    public Child(string Name, int Age, Father father) 
    { 
     this._name = Name; 
     this._age = Age; 
     base = father; //<== this is what I mean to do 
    } 

Я знаю, что я не могу сделать это непосредственно. Каков правильный путь?

Это полный код, некоторый код в испанском

class AuditRegistry : Audit 
{ 
    protected string _cud; 
    protected int _employee, _consecutive; 
    protected DateTime _date; 
    public string CUD { get { return _cud; } } 
    private int Consecutive { get { return _consecutive; } } 
    public DateTime Date { get { return _date; } } 
    public int Client { get; set; } 
    public int Employee { get { return _employee; } } 
    public float NetAmount 
    { 
     get 
     { 
      float acum = 0; 
      //Sum (qty * price) of products in a struct collection 

     } 

    } 
    public float GrossAmount 
    { 
     get 
     { 
      float acum = 0; 
      //Sum in acum (qty * price + tax) of each products in a struct collection 
      return acum; 
     } 
    } 
    public float Paid 
    { 
     get 
     { 
      float acum = 0; 
      //Sum every paid in a struct collection 

      return acum; 
     } 
    } 
    public float Change 
    { get; set;  } 
    public bool FullPaid 
    { 
     get { return (Paid != null && Paid >= NetAmount); } 
    } 
    public ArticlesCollection Products { get; set; } //struct previusly declared 
    public PaidsCollection Paids { get; set; } // struct previously declared 

    public AuditRegistry(string CUD, int Employee, int Consecutive, DateTime Date, int Client, int C, int Company, int Terminal) 
    { 
     this._cud = CUD; 
     this._employee = Employee; 
     this._consecutive = Consecutive; 
     this._date = Date; 
     this.Client = Client; 
     base._c = C; 
     base._company = Company; 
     base._terminal = Terminal; 
    } 
} 

class Order : AuditRegistry 
{ 
    int _consec; 
    public DateTime DeliveryDate { get; set; } 
    public int Consecutive { get { return _consec; } } 
    public char Modification { get; set; } 
    public string Code { get { return (_consec.ToString() + Modificacion); } } 
    public bool Entregado { get; set; } 

    /// <summary> 
    /// Constructor for load a Order from database to memory 
    /// </summary> 
    public Order(DateTime DeliveryDate, int Consecutive, char Modification, AuditRegistry Registry) // Here is the child constructor 
    { 
     this.DeliveryDate = DeliveryDate; 
     this._consec = Consecutive; 
     this.Modification = Modification; 
     base = AuditRegistry; //Wrong idea 
    } 

    /// <summary> 
    /// Constructor for new Order 
    /// </summary> 
    public Pedido(DateTime DeliveryDate, int Employee) 
    { 
     this.DeliveryDate = DeliveryDate; 
     this._consec = 1; 
     this.Modification = 'A'; 
     base._employee = Employee; 
     base._date = DateTime.Now; 

    } 
} 

ответ

3

семантике ребенка будучи отцом в сторону ...

Хороший способ использует конструктор копирования:

class Father 
{ 
    int prop1; 
    int prop2; 
    // much more properties; 
    protected Father(Father copy) 
    { 
     prop1 = copy.prop1; 
     prop2 = copy.prop2; 
    } 
} 
class Child : Father 
{ 
string _name; 
int _age; 
//etc... 
public Child(string Name, int Age, Father father) 
    : base(father) 
{ 
    this._name = Name; 
    this._age = Age; 
} 
} 

Его защищенный конструктор, поэтому его могут назвать только дети родительского класса. Вы используете цепочку конструкторов base(father), чтобы разглядеть конструктор базового класса и передать объект, который хотите скопировать.

Вы не можете назначить объект base непосредственно в коде, это просто ссылка на экземпляр базового класса, из которого производится текущий класс.

+0

Глубокая копия довольно редкая в C#. Убедитесь, что вы понимаете, что вы делаете с этим решением. – BradleyDotNET

+0

Это интересный ответ, никак не может избежать перечисления и соответствия свойств? –

+0

Как вы сказали в своем ответе, было бы гораздо больше смысла, если бы отец был переименован в «Личность». Неясно, был ли это всего лишь плохим примером в вопросе или в том, что происходит. –

2

совершенно нет способ это сделать. A Child- a Father, и вы не можете просто поменять часть объекта на другую ссылку. Ключевое слово base предназначено только для прямого вызова методов базового класса.

Учитывая, что Child является не «тип» Father, наследование, вероятно, неправильный ответ здесь в любом случае. Вам было бы лучше сделать что-то вроде:

(Псевдокод выше). В принципе, предпочитайте композицию над наследованием здесь.

+0

@CesarRomeroo. Вам нужно будет показать еще несколько деталей, например, какие свойства нужно использовать. – BradleyDotNET

+0

@CesarRomeroo Брэдли считает, что из-за примера кода, который сейчас присутствует в вашем сообщении, нет необходимости в наследовании, которое у вас есть. Если у вас есть лучшие имена для классов, с которыми вы на самом деле работаете, было бы очень полезно сделать небольшой пример в вашем сообщении. Это поможет сбросить, если вам нужно наследование или нет. – gunr2171

+0

@BradleyDotNET Я отправил реальный код, большая часть из них находится на испанском языке. Надеюсь, это не вызовет никаких проблем. –

Смежные вопросы