3 Stimmen

Generika oder nur Überladungen verwenden?

Ich habe 3 Klassen, die alle ähnliche Eigenschaften haben. 3 der Eigenschaften sind genau das gleiche über alle 3 Klassen benannt. Anstatt 3 Methoden (eine für jede Klasse) zu schreiben, gibt es eine Möglichkeit, wie ich hier Generika verwenden kann?

public static String GetAString(ActivityMedia activityMedia)
{
   return activityMedia.name;
}

public static String GetAString(AuditMedia auditMedia)
{
   return auditMedia.name;
}

public static String GetAString(VehicleMedia vehicleMedia)
{
   return vehicleMedia.name;
}

EDIT: Offensichtlich mit dem Ziel, einfach ein Objekt einer dieser 3 Klassentypen an GetAString() zu übergeben

2voto

Davide Piras Punkte 42970

Sie brauchen keine Generika, Sie brauchen OOP und Vererbung.

Machen Sie ActivityMedia , AuditMedia y VehicleMedia alle müssen entweder eine Basisschnittstelle wie IMedia oder eine Basisklasse ableiten wie MediaBase

dann schreiben Sie die Methode GetAString nur einmal, das entweder eine IMedia Objekt oder ein MediaBase Objekt.

Eine andere Möglichkeit wäre, dass Sie die Standardeinstellung überschreiben ToString Methode in ActivityMedia , AuditMedia y VehicleMedia Um also nur die Eigenschaft name zurückzugeben, rufen Sie einfach ToString ohne die Notwendigkeit einer GetAString Methode.

2voto

David Heffernan Punkte 585606

Generika werden Ihnen hier nicht helfen, wenn diese Klassen keine gemeinsame Abstammung haben. Die Lösung besteht darin, dafür zu sorgen, dass sie eine gemeinsame Abstammung haben, indem man eine Schnittstelle mit einer name Eigentum. Jede Klasse muss diese Schnittstelle implementieren, dann können Sie eine einzige GetAString Funktion.

2voto

Chris Punkte 3094

Wenn die drei Klassen einen Untersatz der gleichen Eigenschaften haben, ist es besser, stattdessen eine Basisklasse zu implementieren, deren gemeinsame Eigenschaften und Methoden in der Basisklasse erklärt werden, von der die drei Medienklassen abgeleitet sind.

public class ActivityMedia : Media 
{

}

public class Media
{
     public string Name {get;set;}
}

Auf diese Weise verfügen die drei Klassen über einen Satz von Methoden, die an einer Stelle definiert sind, was die Wartung des Codes erheblich erleichtert und Ihnen gleichzeitig die Flexibilität gibt, klassenspezifische Methoden in ihre abgeleitete Implementierung aufzunehmen.

2voto

Abdul Munim Punkte 18167

Es ist logischer, hier Vererbung statt Generika einzusetzen.

Sie können auch Folgendes verwenden Interface aber das würde Ihre Name Eigenschaft duplizieren auf alle Ihre ActivityMedia , AuditMedia , VehicleMedia Klassen.

Betrachten Sie eine Basisklasse Media

public class Media
{
    // consider all properties that are common
    // on Media domain
    public string Name { get; set }
}

Und erben ActivityMedia , AuditMedia , VehicleMedia de Media Klasse.

public class ActivityMedia : Media
{
    // other properties on ActivityMedia domain
}

public class AuditMedia : Media
{
    // other properties on AuditMedia domain
}

public class VehicleMedia : Media
{
    // other properties on VehicleMedia domain
}

Und jetzt verwenden Media Klasse auf Ihrem GetAString Methode

public static String GetAString(Media activityMedia)
{
   return activityMedia.name;
}

public static String GetAString(Media auditMedia)
{
   return auditMedia.name;
}

public static String GetAString(Media vehicleMedia)
{
   return vehicleMedia.name;
}

1voto

Hier kommt das Erbe zu Ihrer Rettung. Haben Sie eine solche Basisklasse:

public class Media
{
    public string name { get { return "Media"; } }
}

Dann wird jede Klasse erben und ihren eigenen Namen definieren:

public class ActivityMedia : Media
{
    public new string name { get { return "Activity Media"; } }
}

Und schließlich:

public static String GetAString(Media media)
{
    return media.name;
}

Bearbeiten: Da Sie mit Ihrem aktuellen Design feststecken, können Sie die Reflexion verwenden:

public static String GetAString(object media)
{
    PropertyInfo propName = media.GetType().GetProperty("name");
    if (propName != null)
        return propName.GetValue(media, null);
    return "";
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X