C# 类的实例化

C# 类的实例化,c#,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 { p

我是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();
我见过并实例化了像这样的类:

A objB = new A();
谁能告诉我为什么我们使用:

A objB = new B();

提前感谢。

由于类
B
继承自
A
,因此
B
的实例也是
A
的实例,并且保证
B
的任何实例都不能分配给
A


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

您在这里所做的是创建一个新的
B
,但您将其视为
a
。在此之后,您可以执行以下操作,例如:

A objB = new B();
B realObjB = (B)objB;
您不直接在代码中使用它,但是您可以将它用于只接受
A
,但您确实希望它是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;
    }
}

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

i、 在您的例子中,类B是从类A派生的。hense
A objB
(属于基类类型)可以表示类型为
B
的对象。 但在这种情况下,objB只能看到基类A的成员函数和属性


谷歌用于向上/向下广播以获取更多信息

通常,如果您只关心objB是一个
A
,而实际上它是一个
B
,则会使用此选项

一个更具描述性的多态性示例更好地为示例服务

与此类似的内容:(为简洁起见,缺少方法体)

事实上,
boat
car
实际上是
boat
car
是不相关的,你要做的就是开车。
Drive()
的实现也可能有所不同,但您同样只对能够驾驶感兴趣

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
最初的代码示例可能是为了显示一个简单的继承示例而设计的,但编写得很糟糕

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