gpt4 book ai didi

C# 装饰器——接口(interface)还是抽象类?

转载 作者:太空狗 更新时间:2023-10-29 21:45:21 29 4
gpt4 key购买 nike

此线程,Decorator pattern implementation , 有一个使用抽象类的装饰器实现。我不喜欢它,因为一个简单的事实,即 CondimentDecorator 在此处给出的实现中不是 Beverage。我会改用接口(interface)。抽象类不是更适合 is-a 关系,而接口(interface)不是更适合 has-a 关系吗?

public interface IBeverage
{
// get a description of the beverage
String Description { get; }

// calculate cost of the beverage
double Cost { get; }
}

// HouseBlend coffee implements IBeverage
public class HouseBlend : IBeverage
{
private string description;
public String Description
{
get { return description; }
}

private double cost;
public double Cost
{
get { return cost; }
}

// Constructor
public HouseBlend() { description = "House Blend"; cost = 0.89; }
}

// DarkRoast coffee implements IBeverage
public class DarkRoast : IBeverage
{
private string description;
public String Description
{
get { return description; }
}

private double cost;
public double Cost
{
get { return cost; }
}

// Constructor
public DarkRoast() { description = "Dark Roast"; cost = 1.10; }
}

// Mocha is a Decorator
public class Mocha
{
// Mocha has-a Beverage
private IBeverage m_beverage;

private string description;
public String Description
{
get { return description; }
}

private public double Cost
{
get { return cost; }
}

// Constructor binds the object passed to member var
public Mocha(IBeverage beverage)
{
m_beverage = beverage; // not necessary for the purpose of this example
description = m_beverage.Description + ", Mocha";
cost = 0.20 + m_beverage.Cost;
}
}

Use like this:
Mocha mhb = new Mocha(new HouseBlend()); // house blend with mocha flavor

最佳答案

基类和接口(interface)都经常用于建模 is-a 关系。即便是IDisposable这样简单的接口(interface),也可以理解为“是一个生命周期手动控制的对象”,一个“一次性”。更明显的区别在于是否允许基础实现或数据字段;以及他们组合多个层次结构的能力。

现在,当您实现任何 模式时,您通常有足够的信息来确定您是否需要数据字段。然而,随着软件的发展,您几乎永远无法排除将来需要在其他模式中涉及相同的类。从这个角度来看,接口(interface)优先于抽象类的普遍偏好为您提供了更多的长期灵 active ——只要您有选择。

根据装饰器的性质,您可以选择。这些组件通常没有预定义的嵌套顺序。如果他们这样做,您将直接使用继承,而不是组件。所以你应该更喜欢接口(interface)来组成装饰器。

综上所述,您原来的论点也是有效的。如果你愿意,可以将装饰器组件(功能)理解为 is-a 关系;但这不是查看它们的最自然方式。

关于C# 装饰器——接口(interface)还是抽象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16091613/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com