类的实例化
问题描述:
我是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();
在此先感谢。
答
你在这里做的是创建一个新的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;
}
}
答
派生类对象可以被表示的它的基类的对象。
即在您的情况下,B类源自A类。亨氏A objB
(它是基类类型)可以表示B
类型的对象。 但在这种情况下,objB只能看到基类A的成员函数和属性。
谷歌为上溯造型/向下转换以获取更多信息
答
正常情况下应该在的情况下使用,你只关心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();
事实上,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
最初的代码示例可能是为了显示一个简单的继承示例,但写得很差。