Переопределить <T>подпись метода с ClassName? - PullRequest
1 голос
/ 02 августа 2010

Есть ли способ переопределить сигнатуру метода абстрактного класса, которая использует <T> с помощью ClassName, чтобы я мог передать объект по ссылке, не восстанавливая его?

Например, у меня есть куча менеджеров объектов,Я хочу, чтобы все они содержали метод .Save (Object), который будет выполнять соответствующее действие сохранения в зависимости от состояния объекта (Вставить, Обновить, Удалить и т. Д.).

Я пытался создать базовый класс, которыйсодержит следующие методы:

protected virtual bool Update<T>(ref T _object) where T : ObjectBase
{
    throw new NotImplementedException();
}

public virtual bool Save<T>(ref T _object) where T : ObjectBase
{ 
    // Figure out which action to take based on _object's state and execute it
}

И я хотел, чтобы мои унаследованные классы определяли методы, используя что-то вроде этого:

public override bool Update<Consumer>(ref Consumer _object)
{
    return _service.UpdateConsumer(ref _object);
}

Моя проблема в том, что я не могу указать, что <T>теперь будет <Consumer>, и, сохраняя его на <T>, я не могу передать его по ссылке

1 Ответ

6 голосов
/ 02 августа 2010

Вместо того, чтобы делать сами методы универсальными, вы должны сделать базовый класс общим.

Например:

public abstract class ObjectManager<T> where T : ObjectBase {
    protected abstract bool Update(T obj);
}

Каждый конкретный ObjectManager должен наследовать ObjectManager типаон управляет следующим образом:

public class ConsumerManager : ObjectManager<Consumer> {
    protected override bool Update(Consumer obj) {
        ...
    }
}

Обратите внимание, кстати, что ваши параметры почти наверняка не должны быть переданы ref.
Вам нужно только ключевое слово ref, если вы хотите изменитьпеременная caller для ссылки на другой экземпляр .
Для получения дополнительной информации см. здесь .

...