繁体   English   中英

C#中的装饰器模式

[英]Decorator pattern in C#

我尝试在 C# 中模拟装饰器模式。

所以我有这些课程:

public abstract class Car
    {

       // private string description;
        public abstract string Descripton 
        {
            get; 
        
        }

        public abstract int Cost();

    }
public abstract class CarDecorator : Car
    {
        protected Car _decorated;
        //private string description;
        public CarDecorator(Car decoratied)
        {
            this._decorated = decoratied;

        }

        public override string Descripton
        {
            get
            {
                return _decorated.Descripton;
            }
        }

        public override int Cost()
        {
            return _decorated.Cost();
        }

 public class EnhancedAutoPilot : CarDecorator
    {   

        public EnhancedAutoPilot(Car car):base(car)
        {
            this._decorated = car;
        }


        public override string Descripton
        {
            get
            {
                return _decorated.Descripton + ", Enhanced autopilot";
            }
        }

        public override int Cost()
        {
            return _decorated.Cost() +  5000;
        }
    }

public class ModelXS:Car
    {
        protected Car _decorated;

        public string Description = "Model XS";

        public override string Descripton
        {
            get
            {
                return _decorated.Descripton;
            }
        }

        public override int Cost()
        {
            return 5500;
        }        
        
    }

 public class ModelXXX : Car
    {
        protected Car _decorated;

        public string Description = "ModelXXX";

        public override string Descripton
        {

            get
            {
                return _decorated.Descripton;
            }

        }

        public override int Cost()
        {
            return 73000;
        }       
    }

 public class RearFacingSeats:CarDecorator
    {

        public RearFacingSeats(Car car):base(car)
        {
            this._decorated = car;

        }

        public override string Descripton
        {
            get
            {
                return _decorated.Descripton + ", Rear Facing Seats  ";
            }
        }

        public override int Cost()
        {
            return _decorated.Cost() + 4000;
        }
    }
public class SmartAirSuspension: CarDecorator
    {
        public SmartAirSuspension(Car car):base(car)
        {
            this._decorated = car;
        }


        public override string Descripton
        {
            get
            {
                return _decorated.Descripton + ",  Smart Air Suspension ";
            }
        }

        public override int Cost()
        {
            return _decorated.Cost() + 2500;
        }



    }
class Program
    {
        static void Main(string[] args)
        {
            Car car = new RearFacingSeats(new SmartAirSuspension(new EnhancedAutoPilot()));
        }
    }

但是后来我收到了这个错误:

There is no argument given that corresponds to the required formal parameter 'car' of 'EnhancedAutoPilot.EnhancedAutoPilot(Car)'

你的 Cars 是错误的,它们看起来像装饰器但不是,事实上它们应该只是 Cars 的实现。 像这个:

public class ModelXS : Car
{
    public override string Descripton
    {
        get
        {
            return "Model XS";
        }
    }

    public override int Cost()
    {
        return 5500;
    }        
}

之后,您可以像@Richard 的回答一样调用构造函数,您就是金子。

你可以放弃

public EnhancedAutoPilot(Car car):base(car)
{
    this._decorated = car; // <<-- this lines
}

因为您已经在CarDecorator类的基本构造函数中进行了该分配。

您正在使用没有参数的 new EnhancedAutoPilot() 构造函数,它需要在您的构造函数签名中使用 Car 参数。

public EnhancedAutoPilot(Car car):base(car)

我看到的另一个问题是您在 Car 类中使用了 _decorated。 被装饰的对象应该只在装饰器类中。

所以我会这样修改你的汽车类:

public class ModelXXX : Car
{
    public override string Descripton => "ModelXXX";

    public override int Cost()
    {
        return 73000;
    }
}

public class ModelXS : Car
{
    public override string Descripton => "Model XS";

    public override int Cost()
    {
        return 5500;
    }
}

主要看起来像这样:

static void Main(string[] args)
{
    Car car = new ModelXXX();

    car = new EnhancedAutoPilot(car);
    car = new SmartAirSuspension(car);
    car = new RearFacingSeats(car);

    Console.Writeline(car.Descripton);
}

该错误告诉您没有将值传递给 EnhancedAutoPilot() 构造函数。 您的所有装饰器都需要传递 Car 实例,因此您必须先实例化汽车,然后再调用您的装饰器。

看起来 ModelXS 和 ModelXXX 是汽车的类型,所以 Program 类应该是:

    class Program
    {
        static void Main(string[] args)
        {
            Car decoratedCar = 
                new RearFacingSeats(
                new SmartAirSuspension(
                new EnhancedAutoPilot(
                new ModelXS())));
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM