2011-02-01 4 views
10

Я пишу абстрактный класс с абстрактным методом (таким образом, все наследуемые от него классы должны реализовать этот метод). Однако я не хочу указывать параметры, которые должен использовать метод, поскольку каждый метод может принимать разные или никакие параметры. Только имя и возвращаемое значение должны быть одинаковыми.Определить абстрактный метод без указания параметров.

Есть ли способ сделать это в C#?

Спасибо за помощь!

ответ

16

Нет, и было бы бессмысленно это делать. Если вы не объявили параметры, вы бы не смогли вызвать метод, заданный только ссылкой на базовый класс. Это точка абстрактных методов: позволить вызывающим абонентам не заботиться о конкретной реализации, а предоставлять им API для использования.

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

Возможно, если бы вы могли дать более подробную информацию, мы могли бы предложить более подходящий подход? Например, вы могли бы быть в состоянии сделать тип родовым:

public class Foo<T> 
{ 
    public abstract void Bar(T t); 
} 

Бетонных подтипы могут либо также быть общими, или выводят из Foo<string>, например.

+0

Каждый ребенок должен создать реализацию этого метода, где он может принимать разные типы ввода, но будет выдавать тот же тип вывода. Таким образом, я могу использовать вывод для выполнения логики моей программы. – TheBoss

+2

@ TheBoss: Точка абстрактных классов (например, интерфейсов) - это позволить использовать ... всюду общую функциональность. Вы не можете использовать его для определения чего-то типа «Вам нужна функция под названием« Foo », которая принимает * некоторые * (или нет) параметры и возвращает' int'; такая функция не может быть абстрагирована, так как ее подпись не определена. Невозможно было бы вызвать (неотразимо) код, который ссылается на класс на более высоком уровне, чем где определенная сигнатура определена, нарушая абстракцию. –

+0

@ TheBoss: Я думаю, вам стоит изучить использование Generics для решения вашей проблемы с дизайном - например, пример кода, который опубликовал Jon. – code4life

0

Нет, не существует.

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

1

Что вы пытаетесь сделать, это запах кода.

Лучшим вариантом было бы реализовать ваш абстрактный класс ISupportInitialize, а затем иметь абстрактный метод Act().

Идея состоит в том, что между звонками до BeginInit и EndInit - это когда ваши типы детей готовятся к действию, собирая разные бит информации, которую вы пытаетесь втиснуть в случайные типы и количество аргументов. После настройки и вызывается EndInit (подтвердите здесь) можно назвать тезис Act().

Кроме того, пожалуйста, пожалуйста, не делайте этого:

public abstract void Act(params object[] arguments); 

Люди выследить вас, если вы делаете что-то вроде этого.

+0

Это интересный подход. Таким образом, у меня было бы логическое поле в классе, которое указывало бы, когда инициализация завершилась, и только тогда метод Act() успешно выполнит иначе, иначе это вызовет исключение? – TheBoss

+0

@ TheBoss - стандартная техника - проверить состояние экземпляра на EndInit и выбросить, если он не находится в правильном состоянии. Типы, реализующие этот интерфейс, часто становятся неизменными после вызова EndInit. – Will

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