函数多态性.当 A:B 时,返回 B 作为 A 为空
本文关键字:返回 作为 为空 多态性 函数 | 更新日期: 2023-09-27 18:33:45
如何做如下的事情?
我的A
对象在调用GetB
后为 null,即使A
继承自B
。
class Program
{
public class A : B
{
}
public class B
{
}
static void Main(string[] args)
{
A a = GetB() as A;
Console.WriteLine(a == null); // it is null!
Console.WriteLine("Console.ReadKey();");
Console.ReadKey();
}
public static B GetB()
{
return new B();
}
}
您可能的意思是函数中的return new A();
。目前,您正在尝试将B
向下投射到A
,这是行不通的。
你试图把你的 B 降为 A。你不能这样做,也没有意义,因为我们不知道B是否会成为A。最好在 A
类中构建一个将B
作为参数的构造函数。
public class A : B
{
public A(B b)
{
//perform your conversion of a B into an A
}
}
public class B
{
public B(){}
}
static void Main(string[] args)
{
B b = new B();
A a = new A(b);
Console.WriteLine(a == null); // it is null!
Console.WriteLine("Console.ReadKey();");
Console.ReadKey();
}
您将无法执行这种类型的铸造,因为B
很可能不是A
!当然,A
是B
的子类,所以你总是可以执行GetA() as B;
。但是走另一条路是没有意义的;A
的实例很可能比 B
的实例提供一些额外的功能。
考虑添加第三个类,C : B
。如果您的函数实际上返回GetB()
new C()
怎么办?这很好,因为C
是一个B
.但你肯定不希望能够把它投到A
? A
和C
几乎肯定没有什么共同之处。
你把它颠倒了:
class Program
{
public class A : B // should be: public class A
{
}
public class B // should be: public class B : A
{
}
static void Main(string[] args)
{
// If you reverse the inheritance on code above
// As Ben Voigt noticed, *as A* is redundant. should be removed
// A a = GetB() as A;
// should be this. B is wider than A, so A can accept B, no need to cast
A a = GetB();
Console.WriteLine(a == null); // it is null!
Console.WriteLine("Console.ReadKey();");
Console.ReadKey();
}
public static B GetB()
{
return new B();
}
}