使用body来抽象一个覆盖

时间:2016-08-08 13:06:46

标签: c# oop override decorator abstract

我有 Beverage 类,它有一些吸气剂/设定剂可以处理饮料的大小。这个程序与装饰器模式有关,所以我想结合同名的一些方法的行为。

我的意图是使用一个允许我获取饮料大小的方法,但是,我希望能够在子类上覆盖该行为。

总而言之,我想要一种方法:

  • 如果不覆盖,则表现为父类
  • 中的方法
  • 如果覆盖,则表现得像编码

我所做的是创建一个名为 getSizeOfBeverage 的方法,其行为类似于我的" old" getSize 做了,并制作了 getSize " new"方法摘要所以我可以覆盖它,但我想要一个不暗示新方法名称的解决方案。

这是我的代码:

using System;

namespace Decorator
{
    class Program
    {
        static void Main(string[] args)
        {
            Beverage beverage = new Espresso("small");
            beverage = new Whip(beverage);
            Console.WriteLine(beverage.getDescription() + " $" + beverage.cost());
        }
    }

    abstract class Beverage
    {
      private string description;
      private string size;

      public Beverage()
      {
        setDescription("Unknown beverage");
      }

      public double getCost()
      {
        return cost();
      }

      public abstract double cost();

      public abstract string getDescription();

      public void setDescription(string desc)
      {
        description = desc;
      }

      public string getSizeOfBeverage()
      {
        return size;
      }

      public abstract string getSize();

      public void setSize(string sz)
      {
        size = sz;
      }
    }

    class Espresso : Beverage
    {
      public Espresso(string sz)
      {
        setSize(sz);
        setDescription("Espresso");
      }

      public override double cost()
      {
        return 1.9;
      }

      public override string getDescription()
      {
        return getDescription();
      }

      public override string getSize()
      {
        return getSizeOfBeverage();
      }
    }

    abstract class CondimentDecorator : Beverage
    {
      public abstract override string getSize();
    }

    class Whip : CondimentDecorator
    {
      private Beverage beverage;

      public Whip(Beverage bv)
      {
        beverage = bv;
      }

      public override double cost()
      {
        if (getSize() == "small")
        {
          return 0.1 + beverage.cost();
        }
        else if (getSize() == "medium")
        {
          return 0.15 + beverage.cost();
        }
        else
        {
          return 0.2 + beverage.cost();
        }
      }

      public override string getDescription()
      {
        return beverage.getDescription() + ", whip";
      }

      public override string getSize()
      {
        return beverage.getSizeOfBeverage();
      }
    }
}

1 个答案:

答案 0 :(得分:6)

  

如果没有覆盖,则表现为父类中的方法

     

覆盖,表现得像编码

每个virtual方法都是这样的:

如果它被覆盖,它的行为就像它被编码一样,如果不只是表现为父类中的方法

来自virtual

的文档
  

virtual关键字用于修改方法,属性,索引器或   事件声明并允许在派生中重写它   类。例如,任何类都可以覆盖此方法   继承它:

abstract

  

当实例方法声明包含一个抽象修饰符时,   该方法据说是一种抽象方法。虽然是抽象的   方法隐式也是一个虚方法,它不能拥有   修饰符虚拟。抽象方法声明引入了一个新的   虚方法但不提供该方法的实现。   相反,非抽象派生类需要提供它们   通过覆盖该方法来实现自己的实现。因为抽象   方法提供没有实际的实现,方法体   抽象方法只包含一个分号。

查看virtual and abstract methods in C#

之间的区别