簡體   English   中英

C#中的靜態抽象方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM