繁体   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