将抽象方法设为可重写的方法并添加一个方法体。
将抽象方法设为可重写的方法并添加一个方法体。
我有一个饮料类,其中有一些获取器/设置器可与饮料的大小一起使用。这个程序涉及装饰器模式,所以我想将一些同名方法的行为组合起来。
我的意图是有一个具有主体的方法,它允许我获取饮料的大小,但是,我希望能够在子类中覆盖该行为。
总之,我想要一个方法,它可以:
- 如果没有被覆盖,则仅扮演父类中的方法
- 如果被覆盖,则行为像编码的方法一样
我所做的是创建一个名为 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日
如果未被重写,只会像父类中方法一样工作;如果被重写,就像代码中写的那样。每个虚方法都是这样的:如果它被重写,它将像代码中写的那样工作,否则就像父类中的方法一样工作。从虚方法的文档中可知:虚关键字用于修改方法、属性、索引器或事件声明,允许在派生类中重写它。例如,任何继承它的类都可以重写此方法。当实例方法声明包含抽象修饰符时,该方法被称为抽象方法。虽然抽象方法在隐式意义上也是虚方法,但它不能具有虚修饰符。抽象方法声明引入了一个新的虚方法,但不提供该方法的实现。相反,非抽象的派生类需要通过重写该方法来提供自己的实现。因为抽象方法不提供实际的实现,所以抽象方法的方法体只包含分号。见C#中虚函数和抽象函数的差异。