功能多态性。当A:B时,返回B为A为空

时间:2012-05-09 23:47:47

标签: c# inheritance polymorphism

我怎样才能做以下事情?
调用A后我的GetB对象为空,即使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();
    }
}

4 个答案:

答案 0 :(得分:4)

你可能在函数中意味着return new A();。目前,您正试图将B向下投射到A,这将无效。

答案 1 :(得分:1)

你反过来了:

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

答案 2 :(得分:1)

您将无法执行此类投射,因为B很可能不是A!当然,AB的子类,因此您始终可以执行GetA() as B;。但走另一条路是没有意义的;很可能A的实例在B的实例上提供了一些额外的功能。

考虑添加第三个类C : B。如果您的函数GetB()实际返回new C()怎么办?这很好,因为CB。但当然你不希望能够将它转换为AAC几乎肯定没什么共同之处。

答案 3 :(得分:1)

你试图将你的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();
}