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

4voto

sll Punkte 59134
  1. eine Schnittstelle mit einer einzigen string Name Eigenschaft
  2. alle drei Klassen durch die Schnittstelle markieren
  3. Jetzt können Sie Media Name direkt auswerten. Ich habe keine Ahnung, warum Sie dafür eine Methode brauchen, aber Sie können trotzdem eine Erweiterungsmethode für den Schnittstellentyp IMedia

    interface IMedia { string Name { get; } }

    class ActivityMedia : IMedia class AuditMedia : IMedia class VehicleMedia : IMedia

    static class MediaExtensions { public static string GetName(this IMedia instance) { return instance.Name; } }

3voto

Vlad Punkte 17635

Wenn sie nicht miteinander in Verbindung stehen, kann eine Möglichkeit darin bestehen, die dynamic (wenn Sie mit C# 4 arbeiten):

public static String GetAString(dynamic d){
    return d.name;
}

Bearbeiten:

Wenn Sie nicht mit C# 4.0 arbeiten, können Sie Reflection verwenden:

public static string GetAString(object o)
{
    System.Reflection.PropertyInfo name = o.GetType().GetProperty("name");
    return (string) name.GetValue(o, null);
}

3voto

Ian Punkte 32230

Eine andere Möglichkeit ist die Verwendung einer Schnittstelle...

public interface INameable
{
   String Name { get; }
}

public static String GetAString(INameable nameable)
{
   return nameable.Name;
}

Obwohl Sie zu diesem Zeitpunkt wahrscheinlich nicht einmal die GetAString-Methode benötigen?

3voto

Russ Cam Punkte 120837

Sie könnten dies mit einer Schnittstelle tun

public interface INamedMedia
{
    string Name { get; }
}

dann wird Ihre Methode

public static String GetAString(INamedMedia media)
{
    return media.Name;
}

und Ihre Klassen implementieren INamedMedia

public class Media : INamedMedia
{
    public string Name { get { return "Media"; } }
}

3voto

Paulie Waulie Punkte 1660

Ich hätte gedacht, dass eine Schnittstelle hier die ideale Lösung wäre:

public interface IMedia
{
    public String Name { get; }
}

und dann könnten Sie Ihre statische Methode haben, die diesen Schnittstellentyp als Parameter annimmt:

    public static String GetAString(IMedia media)
    {
        return media.Name;
    }

Oder alle Ihre Medienklassen könnten von einem Basistyp abgeleitet werden, der die von Ihnen benötigte Eigenschaft enthält, und diese anstelle der Schnittstelle an die Methode übergeben.

Es ist schwierig, Ihnen zu sagen, welche Option die bessere ist, da dies von der Komplexität Ihrer Anwendung und der bereits vorhandenen Vererbungskette abhängt.

Este article kann hilfreich sein

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