2016-08-09 47 views
0

Ich habe 3 Betriebsarten: Hinzufügen, Multiplizieren und der DivisionWie erstellt man 2 generische Klassen, die 2 verschiedene Klassen initialisieren?

Im Folgenden sind die Klassen dieses 3-Betrieb zu handhaben:

public class Add 
{ 
    public int Value {get;set;} 
    public Add(int value) 
    { 
     Value=value; 
    } 
} 

Diese unter Klasse von oben Hauptklasse aufgerufen wird:

class Source : Add 
{ 
    public Source(int value1) 
      :base(value1) 
    { 
    } 
} 

class Destination : Add 
{ 
    public Destination(int value2) 
      :base(value2) 
    { 
    } 
} 

ich oben Klasse nenne wie folgt aus:

Add addObj1 = new Source(10); 
Add addObj2 = new Destination(20); 
int c=addObj1.Value + addObj2.Value; 

Jetzt habe ich eine andere Klasse wie unten:

public class Multiply 
{ 
    public int Value {get;set;} 
    public Multiply(int value) 
    { 
     Value=value; 
    } 
} 

class Source1 : Multiply 
{ 
    public Source(int value1) 
      :base(value) 
    { 
    } 
} 

class Destination1 : Multiply 
{ 
    public Destination1 (int value2) 
      :base(int value2) 
    { 
    } 
} 

Jetzt, als ich diese Klasse so zu nennen versuchen:

Multiply multiplyObj1 = new Source(10); //This is always referring to Source of Add class 
Multiply multiplyObj2 = new Destination(5); //This is always referring to Destination of Add class 

Jetzt, als ich Quelle und Ziel mit Source1 und Destination1 und Call umbenennen wie dies dann funktioniert es:

Multiply multiplyObj1 = new Source1(10); //Working 
Multiply multiplyObj2 = new Destination1(5); // Working 
int c= multipleObj1.Value * multiplyObj2.Value; 

Hinweis: i Im Moment haben erstellt 4 Klasse, in der Quelle und Ziel behandeln hinzufügen Klasse und Source1 und Ziel1 wird behandeln Multiplizieren

Ich spreche darüber, wie 2 Klasse für Add-und Multiply-Klasse oder für andere Klasse zu verwenden (für Division etc ..) .

Nun, wenn ich Division durchführen möchte, dann habe ich wieder 2 Klassen erstellen, um Division zu behandeln.

So, hier möchte ich nicht Quelle und Ziel duplizieren dh statt der Schaffung 4 Klasse dh Quelle, Ziel, Source1 und Destination1 ist es möglich, nur 2 generische Klasse, dh Quelle und Ziel zu schaffen das wird perfekt Handle sowohl Add und Multiple ???

+0

Bitte aktuellen C# -Code eingeben. Mit welcher Syntax deklarieren Sie Ihre Klassen ...? :( –

+0

@ MatíasFidemraizer: Sorry, aber ich habe den Code, den ich gerade benutze, gepostet und ich habe Sie nicht bekommen, was Sie sagen –

+0

Ihr Code kompiliert nicht. Es ist nicht wirklich C#! –

Antwort

3

Lassen Sie uns Ihr Problem jetzt zusammenfassen, nachdem Sie Ihre Frage bereits bearbeitet und Ihren Klassen sinnvolle Namen hinzugefügt haben.

Sie müssen ...

  • Perform Ergänzungen.
  • Führen Sie Multiplikationen.

Und Sie möchten Basisklasse definieren, um sie alle zu regeln.

Zunächst einmal gibt es hier ein Problem. Man kann nicht sagen, dass eine zusätzlich Quelle und eine Multiplikation Quellesind Ergänzungen und Multiplikationen insgesamt.

Es ist wie zu sagen, dass eine Katze sowohl ein Tier als auch ein Mineral ist. Nein, es ist ein Tier.

Diese Situation übersetzt in die objektorientierte Programmierung Welt bedeutet Mehrfachvererbung:

// WRONG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! C# doesn't support multiple inheritance 
public class Source : Addition, Multiplication 
{ 
} 

BTW, eine Quelle der Ergänzungen konnte nicht auch eine Quelle der Multiplikation. Es ist keine technische Einschränkung, , sondern eine semantische Einschränkung. Es ist einfach nicht richtig. Ihr Entwurf ist einfach falsch.

Also, was? Nun, ich glaube, du musst deine Idee und deinen Code umgestalten und du wirst bekommen, was du willst.

Zum Beispiel, wenn eine mathematische Operation Quelle die gleiche Form hat, würde ich eine Klasse Wertquellen definieren:

public class Source 
{ 
    public Source(int value) 
    { 
     Value = value; 
    } 

    public int Value { get; } 
} 

Und dann würde ich Multiply und Add Klassen auf einer Operation Klasse basiert definieren:

public abstract class Operation 
{ 
     public Operation(Source sourceA, Source sourceB) 
     { 
      SourceA = sourceA; 
      SourceB = sourceB; 
     } 

     public Source SourceA { get; } 
     public Source SourceB { get; } 

     public abstract int Do(); 
} 

public class Add : Operation 
{ 
     public Operation(Source sourceA, Source sourceB) : base(sourceA, sourceB) 
     { 
     } 

     public override int Do() => SourceA.Value + SourceB.Value; 
} 

public class Multiply : Operation 
{ 
     public Operation(Source sourceA, Source sourceB) : base(sourceA, sourceB) 
     { 
     } 

     public override int Do() => SourceA.Value * SourceB.Value; 
} 

Jetzt haben Sie eine einzige Quelle für Ihre mathematischen Operationen und nur eine Basisklasse dort zusammenfassen, was in jedem Betrieb üblich ist, und zwei Operationen bereits implementiert.

Beachten Sie, dass Sie die Vorteile von Polymorphismus da jede Operation Operation erbt nehmen:

Source sourceA = new Source(203); 
Source sourceB = new Source(134); 

Operation op1 = new Multiply(sourceA, sourceB); 
Operation op2 = new Add(sourceA, sourceB); 

int result1 = op1.Do(); 
int result2 = op2.Do(); 

Ich glaube, dass dies eine mögliche und akzeptable Design sein könnte.

2

Wahrscheinlich Fall Ihre tatsächliche Nutzung nicht liebt nicht Erbe und Sie müssen mit Zusammensetzung gehen. Bitte überprüfen Sie diese andere Antwort, die ich vor ein paar Tagen gemacht habe: Define a variable of one class from another class

Verwenden wir einen realen Fall: a Car.

Ein Car hat ...

  • Engine
  • Radio
  • Wheel

Es wäre nicht richtig zu sagen, dass ein konkretes CarEngine erben sollte, Radio und Wheel, weil ein Car sie, aber sie‘ Re nicht Autos, aber Teile des Ganzen Car.

Wenn Sie zu diesem Schluss kommen, weil Sie Zusammensetzung benötigen:

public class Car 
{ 
    public Engine Engine { get; set; } 
    public Wheel Wheel { get; set; } 
    public Radio Radio { get; set; } 
} 

auf diese Weise ein konkretes Auto, sagen wir, ein Ferrari kann alles erben ein Car hat in der Standardeinstellung und es kann auch weitere Komponenten hinzufügen:

public class FerrariTestarossa : Car 
{ 
    // More properties and methods that make a FerrariTestarossa unique 
    // from a generic car 
} 

Wahrscheinlich kann man extra polieren Sie dies auf Ihren eigenen Anwendungsfall.