类的实例化

时间:2010-10-25 10:23:56

标签: c#

我是C#的新手。我有一个困惑。

有两个A和B类。

using System;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            A objA = new A();

            A objB = new B();
        }
    }

    class A
    {
        public void MethodA()
        {
            Console.WriteLine("method of A class");
        }
    }

    class B : A
    {
        public void MethodB()
        {
            Console.WriteLine("method of B class");
        }
    }
}

现在我感到困惑的是:

的含义是什么
A objB = new B();

我已经看过并实例化过像thi这样的类:

A objB = new A();

任何人都可以告诉我我们使用的原因:

A objB = new B();

提前致谢。

5 个答案:

答案 0 :(得分:4)

由于课程B继承自AB的实例也是Apolymorphism保证的实例,而不是B的任何实例}可以分配给A

您的代码的唯一目的似乎是展示这一概念。

答案 1 :(得分:4)

您在此处所做的是创建新的B,但您将其视为A。在此之后,你可以做到,例如这样:

A objB = new B();
B realObjB = (B)objB;

您不直接在代码中使用此功能,但是您可以将此功能用于仅接受A但您真正希望它为B的方法。

一个具体的例子:

class Program
{
    static void Main(string[] args)
    {
        Truck truck = new Truck();

        TellMeHowManyWheelsThisHas(truck);
    }

    private static void TellMeHowManyWheelsThisHas(Vehicle vehicle)
    {
        Console.WriteLine("This vehicle has {0} wheels", vehicle.HowManyWheelsDoIHave());
    }
}

abstract class Vehicle
{
    public abstract int HowManyWheelsDoIHave();
}

class Car : Vehicle
{
    public override int HowManyWheelsDoIHave()
    {
        return 4;
    }
}

class Truck : Vehicle
{
    public override int HowManyWheelsDoIHave()
    {
        return 8;
    }
}

答案 2 :(得分:1)

派生类对象可以表示为其基类对象。

,即在你的情况下,类B是从类A派生的.hense A objB(基类类型)可以表示B类型的对象。 但在这种情况下,objB只能看到基类A的成员函数和属性。

google for Upcasting / DownCasting了解更多信息

答案 3 :(得分:1)

通常情况下,如果您只关心objB是A而且事实上它真的是B并不重要,那么这将被使用。

更具描述性的多态性示例可以更好地满足一个例子。

类似于此的东西:(为简洁而缺少方法体)

class Vehicle { public void Drive(); }
class Boat : Vehicle { public void LowerAnchor(); }
class Car : Vehicle { public void SoundHorn(); }

Vehicle boat = new Boat();
boat.Drive();
Vehicle car = new Car();
car.Drive();

boatcar实际上是BoatCar的事实无关紧要,所有你想做的就是开车。 Drive()的实施也可能有所不同,但您再次只对能够驾驶感兴趣。

答案 4 :(得分:0)

using System;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            A objA = new A();
            A objB = new B();
            Console.ReadLine(); // only used to keep the output on-screen
        }
    }

    class A
    {
        public A()
        {
            Console.WriteLine("method of A class");
        }
    }

    class B : A
    {
        public B()
        {
            Console.WriteLine("method of B class");
        }
    }
}

我相信这个代码示例可以更好地提供反映正在发生的事情的输出。我将每个类中的方法移动到构造函数中,以说明从对象继承时实际发生的情况。这是输出:

method of A class
method of A class
method of B class

原始代码示例可能旨在显示一个简单的继承示例,但写得不好。