#c# #derived-class
#c# #производный класс
Вопрос:
Я тестировал с некоторым кодом, и иногда я не могу получить доступ к методу, который находится в производном классе.Что я мог делать неправильно?
namespace Example
{
class Program
{
static void Main(string[] args)
{
A[] test = new A[2];
test[0] = new B();
test[0].Example();
test[0].Example1();
}
public class A
{
public void Example()
{
}
}
class B : A
{
public void Example1()
{
}
}
}
}
Комментарии:
1. Статический тип массива — A[], а не B[]. Если вы не опустите каждый элемент, условно, вы не сможете получить доступ к Example1(). Это, или сделайте это виртуальным методом в A.
2. @TanveerBadar — Я думаю, что выражение «статический тип» вводит в заблуждение — вы должны просто сказать «тип».
3. Тип во время выполнения был бы B для этого элемента, однако тип во время компиляции — A. Это не вводит в заблуждение.
Ответ №1:
Вам нужно привести его к типу B следующим образом:
namespace Example
{
class Program
{
static void Main(string[] args)
{
A[] test = new A[2];
test[0] = new B();
test[0].Example();
(test[0] as B).Example1();
}
public class A
{
public void Example()
{
}
}
class B : A
{
public void Example1()
{
}
}
}
}
Если вы хотите узнать больше о приведении, ознакомьтесь с Документами.
Редактировать: Приведение работает в этом случае, потому что test[0] имеет тип B, если это было не так, выражение (test[0] как B) вернет null, что вызывает исключение NullReferenceException и означает, что test [0] не может быть приведено к типу B.
Комментарии:
1. Вероятно, стоит упомянуть в вашем ответе, что if
test[0]
не являетсяB
, вы получитеNullReferenceException
(посколькуX as Y
возвращаетdefault(Y)
— для ссылочных типов это означает, чтоnull
— ifX
не может быть приведен кY
)