Массив производных классов, вызывающих методы?
Итак, у меня есть массив типа 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();
}