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)
如果没有覆盖,则表现为父类if中的方法
覆盖,表现得像它被编码
每个virtual方法的工作方式如下:
如果它被覆盖,它将表现得像它被编码,如果不是只是作为父类中的方法
从虚拟文档
virtual关键字用于修改方法,属性,索引器或事件声明,并允许在派生类中重写它.例如,任何继承它的类都可以覆盖此方法:
和抽象的
当实例方法声明包含一个抽象修饰符时,该方法被称为抽象方法.虽然抽象方法也隐式也是虚方法,但它不能具有虚拟修饰符.抽象方法声明引入了一个新的虚方法,但没有提供该方法的实现.相反,非抽象派生类需要通过覆盖该方法来提供自己的实现.因为抽象方法没有提供实际的实现,所以抽象方法的方法体只包含一个分号.