C#中的静态抽象方法

时间:2009-11-20 18:53:22

标签: c# .net polymorphism

我知道这是一个静态抽象方法的重言式,但我怎么能这样做:

基础,抽象类:

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);
    }

我该怎么办?

5 个答案:

答案 0 :(得分:4)

我认为你想要的是Factory Design Pattern

答案 1 :(得分:2)

使用'new'代替'覆盖'。

另一种选择是有一个定义Create的抽象Factory类,然后在派生的Factory类中覆盖它。

更新:我不确定你在这之后会发生什么,但是如果你想要“插入”这种类型的创建,你可以用委托代替'abstract'方法,比如这样:

public static Func<DataRow, QTimerDatabaseObject> createFromQTimer { get; set; }

这样,该类的消费者可以取代该实现。

答案 2 :(得分:1)

因此诞生了Factory Design Pattern

答案 3 :(得分:0)

来自MSDN

  

使用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();
    }
}

答案 4 :(得分:-1)

当您调用静态方法时,调用将通过该类。当您调用常规(实例方法)时,调用将通过类的实例。

在同一个定义上使用静态和抽象是没有意义的,因为它们的应用方式不同。

如果您只删除static关键字,则应该能够获得所需的功能。但是根据您的方法的名称判断,创建部分让我相信您想要创建Factory