c# -不能创建抽象类或接口的实例
本文关键字:接口 实例 抽象类 不能 创建 | 更新日期: 2023-09-27 18:16:27
我已经在这个项目上挣扎了将近一个星期了,我需要帮助。我想让我的主程序从三个文件中读取: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'的实例,我猜最后两个问题是因为第一个,我不确定。
My MorgReader是一个抽象类而不是接口。但我已经尝试创建另一个类基于我的MorgReader抽象类,然后从那里生成一个新的MorgReader。但是在我的尝试中产生了更多的错误。
我使用四个文件:Program, MyFileReader.cs, MyCSVReader.cs和mymorreader .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*//
}
如果你需要更多关于我的问题的信息,请告诉我。我很乐意效劳。我只想一劳永逸地消除这个错误。
提前感谢。
要理解为什么这不起作用,您需要更好地理解编译器试图通过错误消息告诉您的内容。
考虑在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:
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方法的代码在哪里定义?换句话说,调用这些方法时会运行什么代码?
答案是这些方法的代码没有定义,因此编译器不允许你构造抽象类。
Edit:但是由于其他原因,这一行看起来也不对,因为您没有为MorgReader定义一个构造函数,该构造函数接受MyCSVReader对象。
请从ReaderDecorator类中删除抽象关键字,并在主程序中使用它来初始化阅读器,因为不能用新的关键字初始化抽象类
MorgReader mr = new ReaderDecorator (new MyCSVReader(new FileReader("C:''Users''miiwo''Dropbox''Morg.txt")));