2017-04-09 2 views
-1

Hier habe ich Special Customer class geschrieben, die child class ist und i overridden Property Cname haben, wo ich Spezial Kunden wünschen kann den Namen nur ändern, wenn sie Cname="Special" aber zur Zeit ist es nicht es geht zu base Cname property geschieht, die Balance Überprüfung ist (was ich don‘ t wollen für Special Customer class) und pls lassen sie mich wissen, wenn ich Runtime Polymorphism durch diesen Code am ErreichenEigenschaft überschreiben funktioniert nicht in C#?

class Customer 
    { 
     protected int _cid,_bal,_status; 
     protected string _cnmae; 

     public Customer(int _cid,int _bal,int _status,string _cname) 
     { 
      this._cid = _cid; 
      this._bal = _bal; 
      this._cnmae = _cname; 
      this._status = _status; 
     } 
     public int Cid 
     { //read only property 
      get 
      {return _cid;} 

      } 
     public virtual string Cname 
     { 
      get 
      {return _cnmae;} 
      set 
      { 
       if (_status != 0 & _bal >= 500) 
       {_cnmae = value;} 
      } 
     } 
     public int Bal 
     { 
      get 
      {return _bal;} 
      set 
      { 
       if (_status != 0 & value >= 500) 
       { _bal = value;} 
      } 
     } 
     public int Status 
     { 
      get{ return _status;} 
      set 
      {_status = value;} 
     } 
     public virtual void display() 
     { 
      Console.WriteLine("id={0} and name={1} and balance={2} and status={3}", _cid, _cnmae,_bal,_status); 
     } 
    } 

class Specialcustomer:Customer 
    { 
     public Specialcustomer(int _cid, int _bal, int _status, string _cname) :base(_cid, _bal, _status,_cname) 
     { 
     } 
     public override string Cname 
     { 
      get 
      {return base.Cname} 
      set 
      {if (value == "SPECIAL") 
       { 
        base.Cname = value; 
       } 
      } 
     } 

     public override void display() 
     { 
      Console.WriteLine("id={0} and name={1} and balance={2} and status={3}", _cid, _cnmae, _bal, _status); 
     } 
} 
class Program 
    {  static void Main(string[] args) 
     { 
      Customer C1 = new Specialcustomer(10, 400, 1, "BOND"); 
      C1.display(); 
      C1.Cname = "SPECIAL"; 
      C1.display(); 
      Console.ReadKey(); 

     } 
    } 
+0

Abgesehen von allem anderen, wäre jetzt eine gute Zeit, um über automatisch implementierte Eigenschaften zu lernen - Sie könnten hier eine Menge Code speichern. Ich würde auch vorschlagen, dass, wenn eine Eigenschaft nicht auf einen Wert festgelegt werden kann, es in der Regel besser ist, eine Ausnahme auszulösen, als den Wert einfach unbeaufsichtigt zu ignorieren. –

+0

(Ich würde auch folgende .NET-Namenskonventionen empfehlen.) –

+0

pls stop -ve Voting !! –

Antwort

1

Ihr Code ist arbeiten bereits - es ist Aufruf der SpecialCustomer.Cname Setter, wie Sie leicht feststellen können, entweder indem Sie einen Haltepunkt darin setzen oder einige Protokollierung hinzufügen. (Habe ich nur noch eine Console.WriteLine Anweisung in dem Setter.)

Allerdings ist es nicht den Wert von Cname wegen der Bedingung in den Customer.Cname Setter Wechsel:

set 
{ 
    if (_status != 0 & _bal >= 500) 
    { 
     _cnmae = value; 
    } 
} 

Wenn Sie Ihren Code ändern, so dass der Rest der Kunde ist (sagen wir) 600 statt 400, dann Cname Änderungen an SPECIAL wie Sie erwarten würden.

Wenn Sie SpecialCustomer wollen den Namen ändern bedingungslos, wenn der angegebene Wert SPECIAL ist, werden Sie diese Funktionalität in der Basisklasse hinzufügen müssen, z.B.

class Customer 
{ 
    public virtual string Cname 
    { 
     get { return _cnmae; } 
     set 
     { 
      if (_status != 0 & _bal >= 500) 
      { 
       SetCnameUnconditionally(value); 
      } 
     } 
    } 

    // This method allows subclasses to bypass the conditions 
    // in the normal setter 
    protected void SetCnameUnconditionally(string value) 
    { 
     _cnmae = value; 
    } 
} 

class SpecialClass 
{ 
    public override string Cname 
    { 
     get { return base.Cname; } 
     set 
     { 
      if (value == "SPECIAL") 
      { 
       SetCnameUnconditionally(value); 
      } 
     } 
    } 
} 
+0

ich weiß, es funktioniert, aber ich werde Basis-Eigenschaft, die ich nicht will.Andernfalls gibt es keine Verwendung von überschreiben, wenn es überprüft die Base-Eigenschaft Condition anstelle der überschriebenen Property (was das sein sollte) –

+0

@DeepakJain: Ihr Code ruft explizit den Base-Property-Setter auf ... aber nur, wenn Sie den Wert auf "SPECIAL" setzen. Ihr Code * setzt * den Wert auf "SPECIAL", also ruft er den Basis-Setter auf. Es funktioniert genau so, wie ich es erwarten würde. Wenn Sie den Saldo auf 600 setzen, aber CName auf "Nicht speziell" setzen, ändert sich das nicht. Sie sind sich wirklich nicht sicher über das erwartete Ergebnis gegenüber dem tatsächlichen Ergebnis. –

+0

wenn ich den Code von base.Cname ändern = Wert; zu Cname = Wert in der Klasse SpecialCustomer wirft es Stapelüberlauf Ausnahme –

Verwandte Themen