如何区分亚型?

时间:2017-01-07 19:05:11

标签: c# polymorphism

假设我们有一系列车辆。 车辆可以是自行车,摩托车或汽车。

现在这个系列中的每辆车都应该清洁窗户。

有一个WindowCleaner接收这个车辆集合。 他如何判断哪辆车需要清洁窗户? 我看到如果我区分WindowCleaner中的车辆子类型,我将违反开放原则。

怎么可能这样做?引入一个抽象的bool属性NeedsWindowsCleaned然后转换为子类型?这在我看来就像伪装的类型内省。

1 个答案:

答案 0 :(得分:1)

using System;
using System.Collections.Generic;

namespace Dirty
{
    class Program
    {
        static void Main()
        {
            var vehicles = new List<Vehicle>();

            var bike = new Bicycle();
            var motorbike = new Motorbike();
            var car = new Car();

            vehicles.Add(bike);
            vehicles.Add(motorbike);
            vehicles.Add(car);

            foreach (var v in vehicles)
            {
                if (v.CleanWindows())
                {
                    Console.WriteLine("{0}", v);
                }
            }

            Console.ReadKey();
        }
    }

    class Vehicle
    {
        public virtual bool CleanWindows()
        {
            return false;
        }
    }

    class Bicycle : Vehicle
    {

    }

    class Motorbike : Vehicle
    {

    }

    class Car : Vehicle
    {
        public override bool CleanWindows()
        {
            return true;
        }
    }
}

我认为这可能就是你所追求的 - 所有类都继承自“车辆”和可以选择覆盖虚拟“CleanWindows”方法......如果不是,则会获得默认的“false”

我希望我没有被误解 - 我对这一切都是新手:)