所以我现在已经在这个项目上挣扎了近一个星期,我需要帮助。请参阅我尝试从三个文件中读取主程序:MyFileReader,MyCSVReader和MyMorgReader。
在我的主程序中,我试图创建一个新的模拟器以及一个新的MorgReader,它可以从文本文件中读取并将该文本文件转换为基于文本文件的模拟器。
这是我在我的程序的主文件中写的:
的Program.cs:
class Program
{
static void Main(string[] args)
{
...
...
Simulator sim = new Simulator(Morg1, Morg2, Morg3, Morg4);
MorgReader mr = new MorgReader(new MyCSVReader(new FileReader("C:\\Users\\miiwo\\Dropbox\\Morg.txt")));
Morg m;
while (m = mr.ReadMorg() != null)
{
sim.Add(m);
}
sim.run();
但有三件事情不起作用:以MorgReader mr
开头的行,while循环和循环内的Add函数。第一个问题是生成一个CS0144代码,它是"无法创建抽象类或接口的实例' MorgReader',我猜测最后两个问题是因为第一个问题,我不确定。
我的MorgReader是一个抽象类,而不是一个接口。但我试图基于我的MorgReader抽象类创建另一个类,然后从那里生成一个新的MorgReader。但是在我的尝试中产生了更多的错误。
我使用四个文件:Program,MyFileReader.cs,MyCSVReader.cs和MyMorgReader.cs。也许问题的根源可能是这些文件中的任何一个我不确定。不要担心,除了Program.cs之外,它们不会太多,我只是为了时间而发布了部分内容。
MyFileReader.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace homework3
{
//*FILE READER CLASS*//
class FileReader : MorgReader
{
//Member Variables
private StreamReader streamReader;
//FileReader function
public FileReader(string fileName)
{
streamReader = System.IO.File.OpenText(fileName);
if (streamReader == null)
throw new Exception("OpenRead() failed for file " + fileName);
}
//Read function
public override string Read()
{
System.IO.StreamReader myFile = new System.IO.StreamReader("C:\\Users\\miiwo\\Dropbox\\Morg.txt");
string myString = myFile.ReadLine();
return streamReader.ReadLine();
}
//Close function
public override void Close()
{
streamReader.Close();
}
}
//*end of MyFileReader class*//
}
MyCSVReader.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace homework3
{
//*MY CSV READER CLASS*//
class MyCSVReader: ReaderDecorator
{
//Member Variables
string[] buf;
char[] delimiterSplit = { ',' };
char[] delimiterAbsorbs = { ' ' };
int index;
//My Csv Reader base
public MyCSVReader(MorgReader wrapped) : base(wrapped)
{
}
//Read Function
protected override string ReadImpl()
{
if (buf == null)
{
String line = Wrapped.Read();
buf = line.Split(delimiterSplit);
index = 0;
}
return buf[index++];
}
//Close Function
public override void Close()
{
WrappedReader.Close();
}
}
//*end of CSV class*//
}
MyMorgReader.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace homework3
{
//*MY MORG READER CLASS*//
abstract class MorgReader
{
//Member Variables
public abstract string Read();
abstract public void Close();
}
//*end of morg reader class*//
//*MY READER DECORATOR CLASS*//
abstract class ReaderDecorator : MorgReader
{
//Member Variables
protected abstract string ReadImpl();
private MorgReader WrapDecorator;
protected ReaderDecorator(MorgReader wrapped)
{
WrapDecorator = wrapped;
}
//WrappedReader function
protected MorgReader WrappedReader
{ get { return WrapDecorator; } }
//Read function
public override string Read()
{
var wrapped = WrappedReader.Read();
if (!string.IsNullOrEmpty(wrapped))
{ wrapped += ","; }
return wrapped + ReadImpl();
}
//Wrapped function
protected MorgReader Wrapped
{
get { return WrapDecorator; }
}
}
//*end of My Reader Decorator Class*//
}
如果您需要有关我的问题的更多信息,请告诉我。我很乐意帮忙。我只想一劳永逸地摆脱这个错误。
提前谢谢。
答案 0 :(得分:0)
请从ReaderDecorator类中删除abstract关键字,并将其与主程序一起用于启动读者,因为您无法使用新关键字启动抽象类。
MorgReader mr = new ReaderDecorator (new MyCSVReader(new FileReader("C:\\Users\\miiwo\\Dropbox\\Morg.txt")));
答案 1 :(得分:0)
要理解为什么这不起作用,您需要更好地了解它试图通过错误消息告诉您的编译器。
考虑 Program.cs 文件中的代码行:
MorgReader mr = new MorgReader(new MyCSVReader(new FileReader("C:\\Users\\miiwo\\Dropbox\\Morg.txt")));
现在我假设该行正在生成此编译器错误消息:
CS0144 code which is
"Cannot create an instance of the abstract class or interface 'MorgReader'"
如果你看一下 MorgReader 类的定义,你会发现它被定义为抽象:
abstract class MorgReader
{
//Member Variables
public abstract string Read();
public abstract void Close(); // I cleaned this line for you
}
现在让我们假设编译器错了,它接受此代码为有效:
MorgReader mr = new MorgReader(new MyCSVReader(new FileReader("C:\\Users\\miiwo\\Dropbox\\Morg.txt")));
mr.Read();
mr.Close();
在上面的代码中, Read 和 Close 方法的代码将被定义在哪里?
换句话说,当你调用这些方法时会运行什么代码?
答案是没有定义这些方法的代码,因此编译器不允许你构造抽象类的原因。
编辑:但由于您没有为 MorgReader 定义带有 MyCSVReader 的构造函数,因此其他原因也显示该行对象