Attualmente sto sviluppando una libreria per un protocollo di applicazione binaria. Il seguente esempio di codice non viene compilato (metodi statici definizione non ammessi nel tipo astratto Peccato :(.), Ma mostra la mia intenzione:Impossibile definire i metodi statici nei tipi astratti. Come lavorare intorno?
public abstract class CmdBody<T>
{
public static abstract byte[] ToBytes(T cmdBody);
public abstract int GetLength();
}
public class CmdBodyA : CmdBody<CmdBodyA>
{
static override byte[] ToBytes(CmdBodyA cmdBody)
{ // Implementation }
}
public class CmdBodyB : CmdBody<CmdBodyB>
{
static override byte[] ToBytes(CmdBodyB cmdBody)
{ // Implementation }
}
[...]
public class Cmd<T>
{
public CmdHeader Header { get; set; }
public CmdBody<T> Body { get; set; }
public byte[] ToBytes()
{
byte[] cmdBytes = new byte[Header.GetLength() + Body.GetLength()];
Header.ToBytes().CopyTo(cmdBytes, 0);
Body.ToBytes().CoptyTo(cmdBytes, Header.GetLength());
return cmdBytes;
}
}
roba di base così bella, un Cmd è costituito da un un'intestazione e un corpo , Il tipo di intestazione è comune a tutti i Cmd (s) e Body con parametri diversi (proprietà) dipendenti dal tipo Cmd e mi piacerebbe lavorare con oggetti Cmd e poter richiamare ToBytes() su di essi per inviarli rete
Nella mia implementazione reale sto utilizzando l'operatore di conversione anziché il metodo ToBytes(), ma volevo mantenere semplice l'esempio del codice, alla fine fa lo stesso lavoro.
Ho molti tipi di comando diversi e non riesco a trovare una soluzione per mantenerlo semplice e ottenere ciò che voglio con un solo tipo Cmd generico. L'unica soluzione che posso pensare sarebbe quella di eliminare il metodo statico nella classe base CmdBody, eliminare l'aspetto generico e per ogni tipo CmdBody creare una classe Cmd associata (classe CmdA, classe CmdB ...) ma questo comporterà molti duplicati di codice alla fine della giornata.
Qualche idea per un bel tentativo di aiutarmi a lavorare intorno a questo?
È possibile che tu stia cercando un'interfaccia, piuttosto che un tipo astratto? Un tipo astratto viene utilizzato per definire le classi che ne ereditano, in cui viene utilizzata un'interfaccia per definire i metodi ei campi richiesti per una classe da implementare. – Codeman
Non importa qui. Interfaccia o classi astratte non possono definire metodi statici, il problema del design rimarrebbe. – darkey
=/Non è possibile definire metodi statici senza implementazione su classi astratte. (Un membro statico non può essere contrassegnato come override, virtuale o astratto) – marcoaoteixeira