使用body来抽象一个方法来覆盖

fre*_*inn 2 c# oop overriding decorator abstract

我有我的Beverage课程,它有一些吸气剂/安装工可以使用饮料的大小.这个程序与装饰器模式有关,所以我想结合一些同名的方法的行为.

我的目的是让一个方法与body允许我获得饮料的大小,但是,我希望能够在子类上覆盖该行为.

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

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

我所做的是创建一个名为getSizeOfBeverage的方法,其行为类似于我的"旧" 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();
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sur*_*yan 8

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

覆盖,表现得像它被编码

每个virtual方法的工作方式如下:

如果它被覆盖,它将表现得像它被编码,如果不是只是作为父类中的方法

虚拟文档

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

抽象的

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

在C#中查看虚方法和抽象方法之间的区别