2014-05-23 3 views
0

Как определить абстрактный метод, если класс Example1 и класс Пример 2 имеют метод подписки, который проходит в другом параметре?Два класса, наследующих один абстрактный класс

abstract class Test 
{ 
public int _a; 
public abstract void Subscribe(); 
} 

class Example1 : Test 
{ 
    public override void Subscribe(int x,int y,int z) 
    { 
    } 
} 

class Example2 : Test 
{ 
    public override void Subscribe(string a, bool b) 
    { 
    } 
} 
+0

Как бы это Работа? Вам нужно передать эти параметры в код позже. Вы не можете передать динамическое число параметров в функцию. – Neolisk

+0

@Neolisk Вы можете использовать 'params'. –

+2

'Example2' не имеет метода' subscribe', у него есть метод 'A' –

ответ

5

Простой. Просто метод Subscribe из Test

abstract class Test 
{ 
    public int _a; 
} 

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

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


Если вам необходимо определить, какие Subscribe для вызова на Test во время выполнения, чем вы можете использовать is

if(abc is Example1) 
{ 
    ((Example1)abc).Subscribe(a, b, c); 
} 
+0

Я пытаюсь сделать что-то вроде if (true) Test abc = new Example1() и if (false) Test abc = new Example2(); а затем в моем коде, я могу использовать abc.Subscribe – user3398315

+0

@ user3398315, но после того, как вы активировали 'abc', как вы намереваетесь решить, следует ли вызывать' Подписаться'? –

+0

Мне нужно будет позвонить Подписаться. Пользовательский ввод будет определять, следует ли его вызывать с помощью примера 1 или примера 2. – user3398315

1

Если ваша цель состоит в том, чтобы обеспечить лишь то, что производные классы имеют в Subscribe метод, и что может потребоваться некоторое количество аргументов, вы можете использовать это:

Вы можете реализовать метод Subscribe в ваших производных классов, но вы должны использовать params подписи, которая не имеет никакого времени компиляции гарантии вы будете получать аргументы правильного типа или количество:

class Example1 : Test 
{ 

    public override void Subscribe(params object[] abcd) 
    { 
     int x = 0; 
     int y = 0; 
     int z = 0; 

     if (abcd[0] is int) 
      x = (int) abcd[0]; 
     else 
      // Complain about this 
      throw new ArgumentException("The first argument is not an integer"); 

     // Check for other parameters 
     // ... 

     Example1Subscribe(x, y, z); 
    } 

    public void Example1Subscribe(int x, int y, int z) 
    { 

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