2015-01-10 3 views
0

У меня есть абстрактный класс, который имеет метод с параметром params, как показано ниже. Я хочу переопределить и скрыть этот метод с помощью метода, который принимает определенное количество параметров вместо params в наследующем классе.Скрытие/переопределение метода базового класса с параметрами в C#

public abstract class BaseClass{ 
    public List<int> list = new List<int>(); 
    public void Add(params int[] numbers){ 
     list.AddRange(numbers); 
    } 
} 

public class ChildClass : BaseClass{ 
    public override void Add(int a, int b, int c){ 
     base.Add(a, b, c); 
    } 
} 

Это работает, но добавить функцию базового класса по-прежнему видна снаружи и добавить функцию в дочернем классе, кажется, не заменить его. Есть ли способ?

ответ

6

Я хочу переопределить и скрыть этот метод с помощью метода, который принимает определенное количество параметров вместо params в наследующем классе.

Вы не можете. Это нарушит наследование. Рассмотрим следующий код:

BaseClass bc = new ChildClass(); 
bc.Add(0, 1); 

Это имеет для компиляции - так, что вы ожидали бы это сделать? Если вы ожидаете, что метод с тремя параметрами будет замените оригиналом, то, предположительно, вы не захотите его компилировать, но тип компиляции bc - это всего лишь BaseClass, а не ChildClass.

Вы можете перегрузкиBaseClass.Add (вам не нужно new, потому что это не получил ту же сигнатуру, что и метод базового класса), но вы не можете заменить его с более ограничительной форме.

+0

Спасибо. Я думаю о других способах реализации этого. Я добавил еще 2 абстрактных класса в середине и сделал метод защиты базы. Один из них предоставляет метод и один шкуры. Это делает мою диаграмму классов более сложной. Существует также способ исключения исключений при использовании нежелательного количества параметров, но я не буду чувствовать себя в безопасности. –

+0

@SirKurt: Если каждый конкретный класс имеет другой набор открытых методов, абстрактный базовый класс (с предположительно только защищенными методами) не очень полезен с точки зрения клиента. Это может позволить вам некоторое повторное использование реализации, но это не сильно отразится на абстракции клиента. –

+0

Хотя, если ваша единственная мотивация заключается в повторном использовании реализации, возможно, просто попросите своих клиентов использовать композицию вместо наследования (или вызвать вызов статического метода полезности). – Brian

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