继承C#使用新函数

时间:2017-12-28 21:56:58

标签: c#

我在C#中制作游戏。我创建了一个基类Shape和其他七个继承自Shape1的其他类(Shape2Shape,...)。在我的主程序中,我使用

跟踪当前正在播放的形状
Shape Current;

然后我将其值随机化为等于其中一个形状,例如:

Current = new Shape1()

问题是,在我随机后我想用

绘制形状
Current.Draw()

每个形状都有自己的Draw函数,我希望它特定地使用该函数,而不是Shape中的函数。我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

您描述的概念称为多态(将不同的对象类型视为一个)。

在C#中,您可以通过virtualabstractoverride关键字执行此操作。在基类中,您将多态方法标记为virtualabstract,区别为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;
        }
    }   
}