2016-08-17 9 views
-3

A.cs enthält diese ->Passing Werte ohne Getter und Setter

namespace Parameterized_Constructor 
{ 
    class A 
    { 
     private int x, y; 

     public A() 
     { } 
     public A(int a, int b) 
     { 
      x = a; 
      y = b; 
     } 
     public void display() 
     { 
      Console.WriteLine("X: {0} Y: {1}", x, y); 
      Console.ReadLine(); 
     } 

     public void setX(int k) 
     { 
      x = k; 
     } 

     public void setY(int l) 
     { 
      y = l; 
     } 

     public int getX() 
     { 
      return x; 
     } 

     public int getY() 
     { 
      return y; 
     } 
    } 
} 

Area.cs enthält diese ->

namespace Parameterized_Constructor 
{ 
    class Area:A 
    { 
     public int calArea() 
     { 
      int are; 
      are = (getX() * getY()); 
      return are; 

     } 

    } 
} 

Program.cs diese enthält ->

namespace Parameterized_Constructor 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Area p = new Area(); 
      p.setX(5); 
      p.setY(10); 
      p.display(); 
      Console.WriteLine("Area {0}", p.calArea().ToString()); 
      Console.ReadLine(); 
     } 
    } 
} 

Also meine Frage ist, können wir das ohne Setter und Getters tun? In C++ brauchen wir solche Dinge nicht richtig? Wir können diese Daten (x, y) nur schützen und den untergeordneten Klassen erlauben, auf sie zuzugreifen. Aber in C# wenn ich das tue Laufzeit zeigt x = 0 und y = 0. Also alles falsch oder ist das die Art und Weise Dinge in C# getan werden? Liegt das an der Kapselungseigenschaft?

+0

Was fragen Sie eigentlich? Ja, Sie können Werte über Methoden anstelle von öffentlichen Eigenschaften übergeben. Fragen Sie, ob dies vorzuziehen ist? Fragen Sie, ob es kompiliert wird? –

+0

Warum? Nur weil Sie das gewohnt sind? Alle Setter und Getter erledigen die von Ihnen erstellten Standardmethoden in kürzerer Form. Sie schaffen mehr Arbeit für sich selbst, die unnötig ist. –

+0

Ich möchte es ohne Setter und Getters tun.! In C++ kann ich Area (int x, inty): A (x, y) verwenden, um diese Werte ohne Getter und Setter an den parametrisierten Konstruktor der Klasse A zu senden. – xxxXXX

Antwort

0

Ich bin nicht ganz sicher, was Sie erreichen möchten, insbesondere welche Eigenschaften Sie tun und nicht (und für wen) sichtbar sein wollen. Aber Ihre Klasse „A“ neu geschrieben werden könnte viel mehr kurz und bündig als

class A 
{ 
    public A() { } 
    public A(int a, int b) 
    { 
     x = a; 
     y = b; 
    } 

    public int X { get; set; } 
    public int Y { get; set; } 

    public void display() 
    { 
     Console.WriteLine("X: {0} Y: {1}", x, y); 
     Console.ReadLine(); 
    } 
} 

würde ich empfehlen, den parameterlosen Konstruktor zu entfernen, obwohl, wenn Sie nicht Instanzen dieser Klasse wollen innerhalb Standard-X erstellt werden, Y-Werte.

Dann könnten Sie die „Area“ Klasse ändern

class Area:A 
{ 
    public Area(int x, int y) : base(x, y) { } 
    public int calArea() 
    { 
     return X * Y; 
    } 
} 

Wenn Sie die X- und Y-Eigenschaften werden bei allen öffentlichen wollten (nur von innen zugänglich A oder eine abgeleitete Klasse, wie Area) dann könnten Sie so etwas tun:

class A 
{ 
    protected int x, y; 
    public A(int a, int b) 
    { 
     x = a; 
     y = b; 
    } 

    public void display() 
    { 
     Console.WriteLine("X: {0} Y: {1}", x, y); 
     Console.ReadLine(); 
    } 
} 

class Area:A 
{ 
    public Area(int x, int y) : base(x, y) { } 
    public int calArea() 
    { 
     return x * y; 
    } 
} 

Sie könnten sogar noch weiter gehen und machen „x“ und „y“ nur lesbar, aber es ist schwer, mehr Hilfe anbieten, ohne mehr zu wissen, was Sie erreichen wollen. So

0

Wahrscheinlich, Sie suchen für dieses

class A { 
    public A(int x, int y) { 
    X = x; 
    Y = y; 
    } 

    public int X {get; set;} 
    public int Y {get; set;} 

    public override string ToString() { 
    return string.Format("X: {0} Y: {1}", X, Y); 
    } 

    public void display() { 
    Console.WriteLine(this); 
    Console.ReadLine(); 
    } 
} 

class Area { 
    // It's convenient provide X and Y values in the constructor 
    public Area(int x, int y) 
    :base(x, y); 

    // If you don't provide and x and y, X and Y will retain their default values - 0 
    // Let's make this fact evident 
    public Area() 
    :this(0, 0); 

    public int CalArea { 
    get { 
     return X * Y; 
    } 
    } 
} 

wenn Area erstellen, können Sie nur eine bequeme costructor nennen:

static void Main(string[] args) { 
     Area p = new Area(5, 10); 
     p.display(); 
     Console.WriteLine("Area {0}", p.calArea()); 
     Console.ReadLine(); 
    } 

Oder wenn Sie new Area() wollen, sollten Sie setzen X und Y Eigenschaften , z.B

static void Main(string[] args) { 
     Area p = new Area() { 
     X = 5, 
     Y = 10 
     }; 

     p.display(); 
     Console.WriteLine("Area {0}", p.calArea()); 
     Console.ReadLine(); 
    }