Массив производных классов, вызывающих методы?

Итак, у меня есть массив типа Account, который состоит из сбережений и чеков, которые получены из Account. Можно ли заставить их вызывать их методы? Компилятор делает видимыми только методы из базового класса, и я не могу получить доступ к методам в производных классах. Бьюсь головой о стену здесь.

3 ответа

Решение

Вам нужно привести элемент в массиве к производному классу:

((Checking)someArray[42]).Whatever();

Если экземпляр на самом деле не относится к этому типу, это InvalidCastException,

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

Вы можете использовать что-то вроде:

Saving s = array[i] as Saving;
if(s != null)
{
   s.SomeSavingMethod();
}
else
{
   Checking c = array[i] as Checking;
   if(c != null)
      c.SomeCheckingMethod();
}

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

Есть в основном два метода, с помощью которых вы можете выполнить те функции, которые вам нужны.

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

public interface IWorker
{
    void DoWork();
}

public class A : IWorker
{
    public void DoWork()
    {
        // TODO: Implement this method
        throw new NotImplementedException();
    }
}

public class B : IWorker
{
    public void DoWork()
    {
        // TODO: Implement this method
        throw new NotImplementedException();
    }
}

Второе - обнаружение типа и вызов метода, если он его поддерживает. Вдоль этих линий. Здесь оператор AS очень удобен, потому что он вернет ненулевое значение только в случае успешного приведения.

List<object> workers = new List<object>() { new A(), new B() };
foreach (object itm in workers)
{
    ClassThatSupportsDoWork obj = itm as ClassThatSupportsDoWork;
    if (obj != null)
        obj.DoWork();
}
Другие вопросы по тегам