将抽象方法设为可重写的方法并添加一个方法体。

18 浏览
0 Comments

将抽象方法设为可重写的方法并添加一个方法体。

我有一个饮料类,其中有一些获取器/设置器可与饮料的大小一起使用。这个程序涉及装饰器模式,所以我想将一些同名方法的行为组合起来。

我的意图是有一个具有主体的方法,它允许我获取饮料的大小,但是,我希望能够在子类中覆盖该行为。

总之,我想要一个方法,它可以:

  • 如果没有被覆盖,则仅扮演父类中的方法
  • 如果被覆盖,则行为像编码的方法一样

我所做的是创建一个名为 getSizeOfBeverage 的方法,它的行为类似于我的“旧” getSize 方法,并使 getSize “新” 方法抽象化,以便我可以覆盖它,但我想要一种不涉及新方法名称的解决方案。

这是我的代码:

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();
      }
    }
}

admin 更改状态以发布 2023年5月23日
0
0 Comments

如果未被重写,只会像父类中方法一样工作;如果被重写,就像代码中写的那样。每个虚方法都是这样的:如果它被重写,它将像代码中写的那样工作,否则就像父类中的方法一样工作。从虚方法的文档中可知:虚关键字用于修改方法、属性、索引器或事件声明,允许在派生类中重写它。例如,任何继承它的类都可以重写此方法。当实例方法声明包含抽象修饰符时,该方法被称为抽象方法。虽然抽象方法在隐式意义上也是虚方法,但它不能具有虚修饰符。抽象方法声明引入了一个新的虚方法,但不提供该方法的实现。相反,非抽象的派生类需要通过重写该方法来提供自己的实现。因为抽象方法不提供实际的实现,所以抽象方法的方法体只包含分号。见C#中虚函数和抽象函数的差异。

0