我目前正在開發一個二進制應用程序協議庫。 下面的代碼示例不編譯(靜態方法的定義不是抽象類型允許太糟糕了:(。),但顯示我的本意:無法在抽象類型中定義靜態方法。如何工作?
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;
}
}
所以很基本的東西,一個cmd由一個頭和主體的,根據Cmd類型,所有Cmd(s)和Body具有不同參數(屬性)的頭部類型是通用的,我想使用Cmd對象,並且能夠在它們上調用ToBytes()以發送它們
在我真正的實現中,我使用的是轉換運算符而不是ToBytes()方法,但我希望保持代碼示例的簡單性,最終它可以完成相同的工作
我有很多不同的命令類型,我不能找出一個解決方案來保持它簡單並實現我想要的只是一個通用的Cmd類型。 我能想到的唯一解決方案是擺脫基本CmdBody類中的靜態方法,擺脫通用方面,併爲每個CmdBody類型製作相關的Cmd類(類CmdA,類CmdB ...),但這將在一天結束時導致大量的代碼重複。
任何想法都可以幫助我在此工作?
是否有可能你正在尋找一個接口,而不是抽象類型?抽象類型用於定義從其繼承的類,其中接口用於定義要實現的類所需的方法和字段。 – Codeman 2012-08-03 18:25:00
這裏沒關係。接口或抽象類不能定義靜態方法,設計問題仍然存在。 – darkey 2012-08-03 18:26:19
= /不能在抽象類上實現靜態方法。 (一個靜態成員不能被標記爲重載,虛擬或抽象) – marcoaoteixeira 2012-08-03 18:27:55