2016-05-11 7 views
0

Gibt es etwas, das ich in /*???*/ (und irgendwo sonst in firstclass) setzen kann, damit es den Typ der Klasse zurückgibt, die es aufruft, ohne es in jeder Klasse zu überschreiben, die erbt die Methode und ohne Präfix mit (secondclass) bei jeder Verwendung. Etwas, das im Grunde bedeutet this.GetType()?Inherited-Methode mit Rückgabetyp der Klasse es ist

public class firstclass 
{ 
    private static /*???*/ current; 
    public static /*???*/ modifycurrent() 
    { 
     /*do stuff to current*/ 
     return current; 
    } 
} 
public class secondclass : firstclass 
{ 
    //nothing concerning the above 
} 

//usage 
secondclass a = new secondclass(); 
secondclass b = a.modifycurrent(); //<--no cast here 

Das Ziel ist, für jede Instanz von secondclasssecondclass eine Variable vom Typ zu teilen. Und wenn ich eine dritte, vierte und fünfte Klasse erben, die von firstclass erben, muss ich nicht alle diese Methoden neu schreiben (das sind exakte Spiegelungen davon, was in firstclass ist, außer dass der Rückgabetyp von modifycurrent() anders ist). Ein Beispiel dafür ist, dass jede Art von Formular die zuvor geöffnete Instanz von sich selbst verfolgt.

+1

modifycurrent ist statisch, so dass Sie es nicht durch Klasseninstanz aufrufen können ... sowieso, was Sie fragen, ist komisch, können Sie erklären, was Sie erreichen möchten? –

+0

a und b sind zweite Klasse? es gibt überhaupt kein Casting, ich kann nicht verstehen, was du erreichen willst ... vielleicht sollte b die erste Klasse sein? – Gusman

+0

Wenn Sie versuchen, diese Art von Problem zu lösen, ist es normalerweise am besten, einen Schritt zurückzutreten und den Code anders zu schreiben, anstatt das ursprüngliche Problem zu lösen. –

Antwort

1

Es klingt wie Sie die Merkwürdiger Recurring Template Muster verwenden möchten:

public class firstclass<T> where T:firstclass 
{ 
    private T current; 
    public T modifycurrent() 
    { 
     /*do stuff to current*/ 
     return current; 
    } 
} 
public class secondclass : firstclass<secondclass> 
{ 
    //nothing concerning the above 
} 

Bitte beachte, dass ich static nahm seit statische Mitglieder nicht vererbt werden.

Es ist nicht vollständig narrensicher wie Sie tun können:

public class thirdclass : firstclass<secondclass> 
{ 
    //nothing concerning the above 
} 

und current wird noch eine Instanz von secondclass zurückzukehren. Es gibt keinen Mechanismus, der Erben zwingt, ihren eigenen Typ als generischen Parameter zu verwenden.

+0

Das ist gut, aber es muss statisch sein, weil es eine Möglichkeit für die neu erstellte 'zweite Klasse' ist, Informationen über die zuvor erstellte statische Klasse zu haben. – gunfulker

+0

Dann nein, weil statische Mitglieder nicht vererbt werden. Sie könnten die Methoden generisch machen, aber ohne zu wissen, was in diesen Methoden ist, kann ich nicht sagen, ob das eine brauchbare Option ist oder nicht. –

Verwandte Themen