【发布时间】:2017-12-07 13:11:42
【问题描述】:
我有一个工作项目,其中包含用于计算、串行端口等的单独类,并希望将它们封装到 dll 中以用于其他类似项目。我正在尝试实现一个工厂,首先是一个串口工厂,所以我可以在多个 dll 之间使用。这是我第一次阅读大量教程并开始使用这个示例:
https://www.codeproject.com/articles/1075518/learning-factory-pattern-using-csharp
哪个效果很好,但我想将 FileLogger 移到它自己的类中,所以我已经尝试了一段时间,但需要朝正确的方向轻推吗?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FactoryPatternSample
{
interface ILogger
{
void Log(string Message);
}
enum LoggerType
{
File,
Database,
EventViewer
}
public class File
{
public class FileLogger : ILogger
{
public void Log(string Message)
{
Console.WriteLine("{0} - Logged in File.", Message);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FactoryPatternSample
{
class Program
{
File.FileLogger flogger = new File.FileLogger();
interface ILogger
{
void Log(string Message);
}
enum LoggerType
{
File,
Database,
EventViewer
}
class DatabaseLogger : ILogger
{
public void Log(string Message)
{
Console.WriteLine("{0} - Logged in Database.", Message);
}
}
class EventViewerLogger : ILogger
{
public void Log(string Message)
{
Console.WriteLine("{0} - Logged in EventViewer.", Message);
}
}
class LoggerFactory
{
public static ILogger Get(LoggerType type)
{
switch (type)
{
case LoggerType.Database:
return new DatabaseLogger();
case LoggerType.EventViewer:
return new EventViewerLogger();
case LoggerType.File:
default:
return new flogger();
}
}
}
static void Main(string[] args)
{
ILogger logger1 = LoggerFactory.Get(LoggerType.Database);
logger1.Log("Message from Main");
ILogger logger2 = LoggerFactory.Get(LoggerType.File);
logger2.Log("Message from Main");
ILogger logger3 = LoggerFactory.Get(LoggerType.EventViewer);
logger3.Log("Message from Main");
Console.ReadKey();
/*Output
Message from Main - Logged in Database.
Message from Main - Logged in File.
Message from Main - Logged in EventViewer.
*/
}
}
}
这是导致问题的原因:
return new flogger();
这是错误:
错误 CS0246 找不到类型或命名空间名称“flogger”(您是否缺少 using 指令或程序集引用?)
我无法让它引用 File.FileLogger,请帮忙?
【问题讨论】:
-
嗯,它是
new File.FileLogger(),正如您在初始化字段的行中所做的那样:File.FileLogger flogger = new File.FileLogger(); -
您要返回
FileLogger的新实例,还是要返回flogger变量中的现有实例?这是一个或另一个。 -
正如 Tim Schmelter 所说,
return flogger;或return new File.FileLogger(); -
感谢“return flogger;”我收到错误 CS0120 非静态字段、方法或属性“Program.flogger”需要对象引用
-
或返回 new 'File.FileLogger();'我收到错误 CS0266 无法将类型“FactoryPatternSample.File.FileLogger”隐式转换为“FactoryPatternSample.Program.ILogger”。存在显式转换(您是否缺少演员表?)
标签: c# design-patterns factory cs0246