我在C#中制作游戏。我创建了一个基类Shape
和其他七个继承自Shape1
的其他类(Shape2
,Shape
,...)。在我的主程序中,我使用
Shape Current;
然后我将其值随机化为等于其中一个形状,例如:
Current = new Shape1()
问题是,在我随机后我想用
绘制形状Current.Draw()
每个形状都有自己的Draw
函数,我希望它特定地使用该函数,而不是Shape
中的函数。我怎么能这样做?
答案 0 :(得分:2)
您描述的概念称为多态(将不同的对象类型视为一个)。
在C#中,您可以通过virtual
,abstract
和override
关键字执行此操作。在基类中,您将多态方法标记为virtual
或abstract
,区别为abstract
方法必须由派生类定义:
public abstract void Draw();
请注意,virtual
方法必须定义正文,而abstract
方法必须不。然后在派生类中使用override
关键字定义相同的方法:
public override void Draw()
{
//whatever implementation
}
有关详细信息,请参阅MSDN
答案 1 :(得分:1)
我必须说@BradleyDotNet解释得非常好,我只是添加一个可能有助于澄清其用法的实际例子。 请注意我如何使用所有虚拟,抽象和覆盖关键字。
using System;
namespace ShapeExample
{
class Program
{
public static void Main(string[] args)
{
for (int i = 0; i < 20; i++)
{
var shape = GetRandomShape();
shape.Draw();
}
}
public static Random Random = new Random();
public static Shape GetRandomShape()
{
var d = Random.Next(3);
switch (d)
{
case 1:
return new Shape1();
case 2:
return new Shape2();
default:
return new Shape3();
}
}
}
public abstract class Shape
{
public virtual void Draw()
{
//Console.WriteLine("General Shape");
Console.WriteLine(" _");
Console.WriteLine(" / \\ ");
Console.WriteLine("/___\\");
}
}
public class Shape1 : Shape
{
public override void Draw()
{
//Console.WriteLine("I want a square instead");
Console.WriteLine(" ____");
Console.WriteLine("| |");
Console.WriteLine("|____|");
}
}
public class Shape2 : Shape
{
public override void Draw()
{
//Console.WriteLine("I want a complicated circle instead");
double r = 3.0;
double r_in = r - 0.4;
double r_out = r + 0.4;
for (double y = r; y >= -r; --y)
{
for (double x = -r; x < r_out; x += 0.5)
{
double value = x * x + y * y;
if (value >= r_in * r_in && value <= r_out * r_out)
{
Console.Write('*');
}
else
{
Console.Write(' ');
}
}
Console.WriteLine();
}
}
}
public class Shape3 : Shape
{
//I don't care how I look like, I'm using the regular shape drawing.
//but I have some particular info that is not part of a regular Shape
public int ParticularField { get; }
public Shape3()
{
ParticularField = -100;
}
}
}