2009-11-20 11 views
1

Я знаю, что это тавтология, чтобы иметь статический абстрактный метод, но как я могу сделать что-то вроде этого:Статические абстрактные методы в C#

Base, абстрактный класс:

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

Как я могу сделать что-то подобное?

+0

См. Этот вопрос: http://stackoverflow.com/questions/823665/c-implement-static-abstract-like-methods – Powerlord

+0

Здесь есть аналогичный вопрос: http://stackoverflow.com/questions/3284/ почему-cant-i-have-abstract-static-methods-in-c – nandokakimoto

+2

Слово «тавтология» не означает, что вы думаете, что это значит. Слово, которое вы ищете, это «оксюморон». –

ответ

2

Используйте «новое» вместо «переопределить».

Другим вариантом является наличие абстрактного класса Factory, который определяет Create, а затем переопределяет это в производном классе Factory.

Обновление: Я не совсем уверен, что вы здесь, но если вы хотите, чтобы вы могли «подключиться» к созданию этого типа, вы можете заменить «абстрактный» метод на делегат, например:

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

Таким образом, потребитель класса может заменить реализацию.

+0

новый скроет метод, а не переопределит его ... – Malfist

+0

, что вы хотите - в отсутствие экземпляра вызывающему нужно выбрать реализацию этого типа. – alexdej

0

От 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(); 
    } 
} 
+0

Я понимаю это. – Malfist

-1

При вызове статического метода вызов идет через класс. Когда вы вызываете обычный (метод экземпляра), вызов проходит через экземпляр класса.

Не имеет смысла иметь статические и абстрактные те же определения, потому что они применяются по-разному.

Если вы просто удалите ключевое слово static, вы сможете получить необходимую функциональность. Но судя по имени вашего метода, созданная часть заставляет меня поверить, что вы хотите создать Factory.

+0

Я знаю это ... Я спрашиваю, как создать такой тип поведения, я знаю, что это невозможно для этой прямой реализации. – Malfist

Смежные вопросы