[英]Static Abstract methods in C#
我知道擁有靜態抽象方法是一種重言式,但是我該如何做這樣的事情:
基礎,抽象類:
abstract class QTimerDatabaseObject {
public static abstract QTimerDatabaseObject createFromQTimer(DataRow QTimerRow);
public abstract void saveRow();
}
示例實現(在擴展QTimerDatabaseObject的User類內部):
public static override QTimerDatabaseObject createFromQTimer(DataRow QTimerRow) {
int ID = (int)QTimerRow["id"];
string Username = QTimerRow["username"].ToString();
string Init = (QTimerRow["init"] ?? "").ToString();
string FirstName = (QTimerRow["FirstName"] ?? "").ToString();
string MiddleInitial = (QTimerRow["Midinit"] ?? "").ToString();
string LastName = (QTimerRow["Lastname"] ?? "").ToString();
string Salutation = (QTimerRow["salutation"] ?? "").ToString();
int RefNum = (int)(QTimerRow["refnum"] ?? -1);
int Timestamp = (int)(QTimerRow["timestamp"] ?? -1);
int DelCount = (int)(QTimerRow["delcount"] ?? 0);
bool IsHidden = (bool)(QTimerRow["hidden"] ?? false);
return new User(ID, Username, Init, FirstName, MiddleInitial, LastName, Salutation, RefNum, Timestamp, DelCount, IsHidden);
}
我該怎么做?
我認為您想要的是Factory Design Pattern 。
使用“新”而不是“替代”。
另一種選擇是擁有一個抽象的Factory類,該類定義Create,然后在派生的Factory類中覆蓋它。
更新:我不太確定您在這里做什么,但是如果您想使“插入”到這種類型的創建中成為可能,則可以用委托替換“抽象”方法,如下所示:
public static Func<DataRow, QTimerDatabaseObject> createFromQTimer { get; set; }
這樣,該類的使用者可以替換實現。
因此誕生了工廠設計模式 。
從MSDN :
使用static修飾符聲明一個靜態成員,該成員屬於類型本身而不是特定對象。
由於static是要聲明該類型的靜態成員,因此您不能覆蓋static方法。
您可以為要返回的靜態方法創建一個接口,然后將其強制轉換為您的特定類型:
public interface IQTimerDatabaseObject
{
//whatever implementation you need
}
abstract class QTimerDatabaseObject
{
public static IQTimerDatabaseObject createFromQTimer(DataRow QTimerRow)
{
IQTimerDatabaseObject obj = //some code to statisfy the interface
return obj;
}
public abstract void saveRow();
}
class QTimer : QTimerDatabaseObject
{
public new QTimer createFromQTimer(DataRow QTimerRow)
{
return QTimerDatabaseObject.createFromQTimer(QTimerRow) as QTimer;
}
public override void saveRow()
{
throw new NotImplementedException();
}
}
當您調用靜態方法時,調用將遍歷該類。 當您調用常規(實例方法)時,調用將遍歷該類的實例。
在相同的定義上使用靜態和抽象是沒有意義的,因為它們的應用方式不同。
如果僅刪除static
關鍵字,則應該能夠獲得所需的功能。 但是從您的方法名稱來看,創建部件使我相信您想要創建一個Factory 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.