我知道这是一个静态抽象方法的重言式,但我怎么能这样做:
基础,抽象类:
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);
}
我该怎么办?
答案 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。