假设我们有一系列车辆。 车辆可以是自行车,摩托车或汽车。
现在这个系列中的每辆车都应该清洁窗户。
有一个WindowCleaner接收这个车辆集合。 他如何判断哪辆车需要清洁窗户? 我看到如果我区分WindowCleaner中的车辆子类型,我将违反开放原则。
怎么可能这样做?引入一个抽象的bool属性NeedsWindowsCleaned然后转换为子类型?这在我看来就像伪装的类型内省。
答案 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”
我希望我没有被误解 - 我对这一切都是新手:)