用抽象的方法抽象出一个方法

我有我的饮料课,有一些获得者/设置者可以使用饮料的大小。 这个程序与装饰器模式有关,所以我想结合一些同样命名的方法的行为。

我的意图是有一个方法,可以让我得到饮料的大小,但是,我希望能够覆盖子类的行为。

总之,我想要一个方法:

  • 如果没有重写,只是表现为父类中的方法
  • 如果重写,就像编码一样
  • 我所做的是创建一个名为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();
          }
        }
    }
    

    如果没有重写,就会像父类中的方法一样行为

    重写,就像编码一样

    每个virtual方法都是这样工作的:

    如果它被覆盖,它将表现得像编码一样,如果不仅仅表现为父类中的方法

    来自虚拟文档

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

    和抽象

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

    查看C#中虚拟方法和抽象方法的区别

    链接地址: http://www.djcxy.com/p/38129.html

    上一篇: make abstract a method with body for overriding

    下一篇: Consequences of using Virtual keyword on all methods in a class?