我有 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();
}
}
}
答案 0 :(得分:6)
如果没有覆盖,则表现为父类中的方法
覆盖,表现得像编码
每个virtual
方法都是这样的:
如果它被覆盖,它的行为就像它被编码一样,如果不只是表现为父类中的方法
来自virtual
的文档virtual关键字用于修改方法,属性,索引器或 事件声明并允许在派生中重写它 类。例如,任何类都可以覆盖此方法 继承它:
之间的区别当实例方法声明包含一个抽象修饰符时, 该方法据说是一种抽象方法。虽然是抽象的 方法隐式也是一个虚方法,它不能拥有 修饰符虚拟。抽象方法声明引入了一个新的 虚方法但不提供该方法的实现。 相反,非抽象派生类需要提供它们 通过覆盖该方法来实现自己的实现。因为抽象 方法提供没有实际的实现,方法体 抽象方法只包含一个分号。