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