2011-01-19 4 views
2

У меня есть функция, сделать общие вещи:«пустота» в качестве родового параметра

class MyBaseClass<TOut> 
{ 
    public abstract TOut MyFunc<TOut>(); 
} 

и конкретные реализации

class MyDerivedClass : MyBaseClass<string> 
{ 
    public override string MyFunc<string>() 
    { 
     string strSomeThing; 
     ... initialization of strSomeThing; 
     return strSomeThing; 
    } 
} 

и несколько аналогичных производных классов.

(Нет никаких ограничений на общий тип).

Сегодня я получил случай, когда мне нужно «MyFunc», чтобы делать какие-то действия (скажем, сохранить данные в БД) и не нужно возвращать ничего значимого ...

В этом случае я хотел бы иметь " пустота»в качестве параметра типа ...

Я пытался сделать это, компилятор ответил:

не может использовать„недействительным“в качестве параметра типа.

Не могли бы вы посоветовать, что является лучшим решением для моего дела?

Просто используйте «Объект» в качестве типа параметра и возвращаете значение null в функции?

Есть ли что-то лучше?

Большое спасибо!

+0

Это неудачный факт, что 'GenericType ' не представляется возможным, в отличие от функциональных языков с типом 'unit', где вы можете сделать это легко. –

ответ

1

Стандартная практика заключается в создании отдельного не общего типа для этого случая.

EDIT: Например:

class MyBaseClass 
{ 
    public abstract void MyFunc(); 
} 

В зависимости от того, как вы используете их, вы можете сделать их разделяют интерфейс или базовый класс.

+0

Можете ли вы привести пример на основе кода OP? Я не уверен, что понял. – Andrey

+0

@ Andnd: Здесь вы идете. – SLaks

+0

Даже если у них есть аналогичный интерфейс, я не смогу включить T MyFunc() в этот интерфейс, поскольку «MyBaseClass» ничего не знает о «». и в результате я не смогу назвать этот «MyFunc» «полиморфным». – Budda

0

Вы можете ввести «_void» в короткий int или что-то в этом роде и использовать его для удобства чтения. (и просто верните 0).

+0

typedef с C#. крутая идея! – Andrey

+1

C# не поддерживает typedefs. Вы можете создать класс 'struct Nothing {}' – SLaks

+0

Nothing - возможно, это хорошая идея. Почему это не ответ? – Budda

0

Это огромный запах. Что бы ни происходило, вы определили общий класс, у которого есть метод, возвращающий объекты, и вы хотите извлечь из этого класса, а не возвращать что-либо, что говорит о том, что что-то очень не так. Весьма вероятно, что этот метод делает что-то другое в различных перегрузках (некоторые перегрузки сохраняются в базе данных, а некоторые перегрузки отправляют задание на принтер, а некоторые перегрузки создают объект или что-то еще), и это плохой дизайн.

Просьба сообщить о вашем случае использования, но мое шестое чувство, что редизайн является лучшим решением вашей проблемы («Док, это больно, когда я делаю это.» «Тогда прекратить делать это.»)

+0

У меня есть точка. Чтобы быть понятным, рассмотрим пример из двух методов: Создать (который сохранит некоторый объект в БД и возвращает его ID) и Удалить (который получает идентификатор объекта и удаляет его из БД). Оба метода генерируют исключение, если что-то не удается. Нет никакого возврата к второму методу ... У меня есть набор таких методов, которые вызывается аналогичным образом: входные параметры журнала, раздел авторизации, блок обработки исключенных разделов, выход журнала параметры. Поэтому я создал отдельный класс для каждого «метода», каждый класс имеет «T Execute()» ... Это плохо? – Budda

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