【发布时间】:2014-10-29 02:06:25
【问题描述】:
我尝试在 C# 中运行以下示例程序,我得到的输出是“You are getting a computer”而不是“You're getting a computer and a disk and a monitor and a KeyBoard”。
为什么会发生这种情况 C# 仅在 Java 中没有。 我 java 相同的代码,我得到了适当的输出。
如果我调试我发现创建的对象层次结构是正确的,但调用 computer.getComputer() 总是转到超类而不是驱动类,这就是问题所在。
请帮我解决这个问题。
namespace DecoratorTest1
{
public class Computer
{
public Computer()
{
}
public String getComputer()
{
return "computer";
}
}
public abstract class ComponentDecorator : Computer
{
public abstract String getComputer();
}
public class Disk : ComponentDecorator
{
Computer computer;
public Disk(Computer c)
{
computer = c;
}
public override String getComputer()
{
return computer.getComputer() + " and a disk";
}
}
public class Monitor : ComponentDecorator
{
Computer computer;
public Monitor(Computer c)
{
computer = c;
}
public override String getComputer()
{
return computer.getComputer() + " and a Monitor";
}
}
public class KeyBoard : ComponentDecorator
{
Computer computer;
public KeyBoard(Computer c)
{
computer = c;
}
public override String getComputer()
{
return computer.getComputer() + " and a KeyBoard";
}
public string call()
{
return "";
}
}
class Program
{
static void Main(string[] args)
{
Computer computer = new Computer();
computer = new Disk(computer);
computer = new Monitor(computer);
computer = new KeyBoard(computer);
Console.WriteLine(" You are getting a " + computer.getComputer());
Console.ReadKey();
}
}
}
【问题讨论】:
-
您可以删除
ComponentDecorator并将Computer基类中的getComputer设置为virtual,因此,您可以使用默认行为并使其在子类中正常工作。跨度> -
@FelipeOriani 这不违反他所询问的装饰器模式吗?整个想法是不要修改
Computer,因为它可能不是您代码库的一部分。
标签: c# design-patterns decorator