用抽象的方法抽象出一个方法
我有我的饮料课,有一些获得者/设置者可以使用饮料的大小。 这个程序与装饰器模式有关,所以我想结合一些同样命名的方法的行为。
我的意图是有一个方法,可以让我得到饮料的大小,但是,我希望能够覆盖子类的行为。
总之,我想要一个方法:
我所做的是创建一个名为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?