我是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();
提前致谢。
答案 0 :(得分:4)
由于课程B
继承自A
,B
的实例也是A
和polymorphism保证的实例,而不是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();
boat
和car
实际上是Boat
和Car
的事实无关紧要,所有你想做的就是开车。 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
原始代码示例可能旨在显示一个简单的继承示例,但写得不好。