[英]C# decorator pattern and wrapping issues
我在包装代码返回值时遇到问题。 所以基本上我试图显示以下输出:
Morg,类型 ,xy, 桨
我的代码在C#中,根据我的代码,这些输出基于我的字符串返回值。 我正在使用它们希望测试我的程序,看它是否有效。 到目前为止它工作但不是我想要的方式。 我只能显示类型返回值,但我似乎无法显示其余部分。
这就是它给我的东西。
类型
但是最顶端的那个是我想要显示为输出的那个。 不只是类型。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
MorgReader myMorg = new FileReader();
MorgReader myMorg2 = new MorgType(new MorgXY(new MorgMovement(new FileReader())));
Console.WriteLine(myMorg.Read());
Console.WriteLine(myMorg2.Read());
}
}
// THE MAIN ABSTRACT CLASS //
abstract class MorgReader
{
public abstract string Read();
}
// THE CLASS THAT WILL READ THE FILE //
class FileReader : MorgReader
{
public override string Read()
{
return "Morg";
}
}
// MY READER DECORATOR //
abstract class ReaderDecorator : MorgReader
{
private MorgReader wrappedReader;
protected ReaderDecorator(MorgReader wrapped)
{
wrappedReader = wrapped;
}
protected MorgReader WrappedReader
{ get { return wrappedReader; } }
}
class MorgType : ReaderDecorator
{
public MorgType(MorgReader wrapped) : base(wrapped)
{ }
public override string Read()
{
return "type";
}
}
class MorgXY : ReaderDecorator
{
public MorgXY(MorgReader wrapped) : base(wrapped)
{ }
public override string Read()
{
return "x,y";
}
}
class MorgMovement : ReaderDecorator
{
public MorgMovement(MorgReader wrapped) : base(wrapped)
{ }
public override string Read()
{
return "paddle";
}
}
}
更改ReaderDecorator
类
abstract class ReaderDecorator : MorgReader
{
private MorgReader wrappedReader;
protected ReaderDecorator(MorgReader wrapped)
{
wrappedReader = wrapped;
}
protected MorgReader WrappedReader
{ get { return wrappedReader; } }
public override string Read()
{
var wrapped = WrappedReader.Read();
if (!string.IsNullOrEmpty(wrapped))
wrapped += ", ";
return wrapped + ReadImpl();
}
// template method
protected abstract string ReadImpl();
}
像这样在具体类中实现ReadImpl
class MorgType : ReaderDecorator
{
public MorgType(MorgReader wrapped) : base(wrapped)
{ }
protected override string ReadImpl()
{
return "type";
}
}
如果您不想引入ReadImpl
方法,那么您应该在每个具体类中重写Read
方法
public override string Read()
{
var wrapped = WrappedReader.Read();
if (!string.IsNullOrEmpty(wrapped))
wrapped += ", ";
return wrapped + "type";
}
我认为你的装饰图案缺失了......好吧,装饰品(LOL)。 所以装饰你的抽象类后代,如下所示:
class MorgType : ReaderDecorator
{
public MorgType(MorgReader wrapped) : base(wrapped)
{ }
public override string Read()
{
return WrappedReader == null ? "type" : WrappedReader.Read() + ",type";
}
}
class MorgXY : ReaderDecorator
{
public MorgXY(MorgReader wrapped) : base(wrapped)
{ }
public override string Read()
{
return WrappedReader == null ? "x,y" : WrappedReader.Read() + ",x,y";
}
}
class MorgMovement : ReaderDecorator
{
public MorgMovement(MorgReader wrapped) : base(wrapped)
{ }
public override string Read()
{
return WrappedReader == null ? "paddle" : WrappedReader.Read() + ",paddle";
}
}
你应该看到你期望myMorg2
的结果,这是你在帖子中描述的逗号分隔的输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.