为什么Console
显示B
类型而不是A
,即使a2
已分配给new B()
?我无法准确理解A a2 = new B()
中发生的事情。
class A { }
class B : A { }
...
A a1 = new A();
A a2 = new B();
Console.WriteLine(a2.GetType());
答案 0 :(得分:3)
变量只是指向对象的东西。您可以通过它继承的任何类型的变量(或它实现的任何接口)引用对象,但这不会改变对象本身的类型 - 这是多态的形式之一在C#。
答案 1 :(得分:1)
因为您已经创建了类B
的实例而不是A
,并且由于OOP的继承功能,您可以保留类型A
的变量,因为您继承了{{1}来自B
的课程。
但A
的实际类型为a2
而不是B
,但它也可以表示为A
,但A
会重新运行时间类型是GetType()
。
您也可以查看此SO post,其中说明了对象的B
应返回的内容,GetType
是什么以及我们如何使用typeof()
用于继承层次结构检查。
希望它有所帮助。
答案 2 :(得分:0)
仅仅因为您通过try catch
类型引用它并不意味着实际类型突然变为const fetchItem = async() => {
try {
const response = await axios("http://localhost:4000/items?id=2");
console.log(response.data);
} catch (error) {
console.log(error)
}
};
,它仍然是A
个对象。您决定使用A
创建一个。
答案 3 :(得分:0)
您应该了解编译时类型和运行时类型之间的区别。编译时类型是编译器在这种情况下所知道的类型 - 已声明的类型 - A.运行时类型是在这种情况下恰好由变量引用的对象的类型B.编译时间(编译器的内容)知道)和运行时(程序实际运行时会发生什么)是一个非常重要的区别,适用于类型,错误甚至计算。