函数多态性.当 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();
    }
}

函数多态性.当 A:B 时,返回 B 作为 A 为空

您可能的意思是函数中的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!当然,AB的子类,所以你总是可以执行GetA() as B;。但是走另一条路是没有意义的;A 的实例很可能比 B 的实例提供一些额外的功能。

考虑添加第三个类,C : B 。如果您的函数实际上返回GetB() new C()怎么办?这很好,因为C是一个B.但你肯定不希望能够把它投到AAC几乎肯定没有什么共同之处。

你把它颠倒了:

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();
    }
}