2009-12-15 14 views
17

Alles, was ich tun möchte, ist sicher machen, die Kinderklassen der Klasse Artikel eine statische Methode implementieren und ich möchte dies zum Zeitpunkt der Kompilierung überprüft werden Laufzeitfehler zu vermeiden.Wie kann ich das Erben von Klassen erzwingen, um eine statische Methode in C# zu implementieren?

abstrakte Klassen mit statischen Methoden scheinen nicht zu funktionieren:

ERROR: A static member cannot be marked as override, virtual, or abstract

public abstract class Item 
{ 
    public static abstract Item GetHistoricalItem(int id, DateTime pastDateTime); 
} 

public class Customer : Item 
{ 
    public static override Customer GetHistoricalItem(int id, DateTime pastDateTime) 
    { 
     return new Customer(); 
    } 
} 

public class Address : Item 
{ 
    public static override Address GetHistoricalItem(int id, DateTime pastDateTime) 
    { 
     return new Address(); 
    } 
} 

und Schnittstellen scheinen nicht zu funktionieren entweder:

ERROR: Customer does not implement interface member GetHistoricalItem()

public class Customer : Item, HistoricalItem 
{ 
    public static Customer GetHistoricalItem(int id, DateTime pastDateTime) 
    { 
     return new Customer(); 
    } 
} 

public class Address : Item, HistoricalItem 
{ 
    public static Address GetHistoricalItem(int id, DateTime pastDateTime) 
    { 
     return new Address(); 
    } 
} 

interface HistoricalItem 
{ 
    Item GetHistoricalItem(); 
} 

Gibt es einige wo rkaround, damit der Compiler prüft, ob erbende Klassen eine statische Methode mit einer bestimmten Signatur implementieren oder nicht?

Antwort

0

Per Definition kann eine statische Methode in abgeleiteten Klassen nicht implementiert werden.

3

Es macht keinen Sinn Kunden zu zwingen, eine statische Methode zu implementieren - statische Methoden sind „unveränderlich.“ (Es gibt wahrscheinlich einen besseren Weg, um sie zu beschreiben, aber das ist alles, was mein Geist gerade ausdenken kann!)

Wenn eine Art von Overriding erforderlich ist, würde ich in Betracht ziehen, das Design erneut zu besuchen, möglicherweise in irgendeiner Form einer Kombination von Einlingen und Injektion.

+0

Ich habe eine Klasse Item, die verschiedene Objekte erben, z. Kunde, Adresse usw. Und wenn eine Klasse vom Typ Item ist, möchte ich in der Lage sein, eine Factory-Methode namens GetHistoricalItem() aufzurufen. Also möchte ich sagen können Adresse address = Address.GetHistoricalItem (...). Und ich möchte zur Kompilierzeit wissen, dass all meine Klassen, die Item erben, dies tun. Es sollte genauso funktionieren, wie es beispielsweise Methoden tun. –

+0

@EdwardTanguay das ist von vor langer Zeit, aber Sie sind besser dran, erstellen Sie eine Art von History-Klasse (Instanz), die normale Methoden zum Abrufen von Adressen enthält. Registrieren wäre zum Beispiel ein guter Name. –

19

Es gibt eine Abhilfe, die ich für Ihr Szenario herausgefunden:

public class Customer : Reference<Customer>, IHistoricalItem 
{ 
} 

public class Address : Reference<Address>, IHistoricalItem 
{ 
} 

public interface IHistoricalItem 
{ 
} 

public class Reference<T> where T : IHistoricalItem, new() 
{ 
    public static T GetHistoricItem(int id, DateTime pastDateTime) 
    { 
     return new T(); 
    } 
} 

hoffe, das hilft !!

+0

+1 Das ist der Weg, um das Problem von OP zu lösen. – Groo

+2

Es wird kein Fehler erzeugt, auch wenn Kunde/Adresse die GetHistoricItem-Funktion nicht implementiert. Fehle ich etwas? – Bill

+0

@Yongke Bill Yu: Warum denkst du sollte es? – jwaliszko

Verwandte Themen