代码之家  ›  专栏  ›  技术社区  ›  Malfist

C语言中的静态抽象方法#

  •  1
  • Malfist  · 技术社区  · 15 年前

    我知道使用静态抽象方法是一种重言式,但我如何才能做到这一点:

    基本,抽象类:

    abstract class QTimerDatabaseObject {
    
        public static abstract QTimerDatabaseObject createFromQTimer(DataRow QTimerRow);
        public abstract void saveRow();
    }
    

    示例实现(在扩展qTimerDataBaseObject的用户类内):

        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 回复  |  直到 15 年前
        1
  •  4
  •   Winston Smith    15 年前

    我想你想要的是 Factory Design Pattern .

        2
  •  2
  •   alexdej    15 年前

    使用“new”而不是“override”。

    另一个选项是拥有一个定义create的抽象工厂类,然后在派生工厂类中重写该类。

    更新:我真的不确定您在这之后要做什么,但是如果您想“插入”到这个类型的创建中,您可以用委托替换“abstract”方法,如下所示:

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

    这样类的使用者就可以替换实现。

        3
  •  1
  •   Jim Mischel    15 年前

    就这样诞生了 Factory Design Pattern .

        4
  •  0
  •   scottm    15 年前

    MSDN 以下内容:

    使用静态修饰符声明 静态成员,属于 键入自身而不是特定的 对象。

    由于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();
        }
    }
    
        5
  •  -1
  •   Bob    15 年前

    当调用静态方法时,调用将通过类进行。当调用常规(实例方法)时,调用将遍历类的实例。

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

    如果你只是移除 static 关键字您应该能够获得所需的功能。但是从你方法的名字来看,创造部分让我相信你想创造一个 Factory .