这个问题在这里已经有了答案:
Why abstract class and interface cannot be instantiated?
(2 个回答)
5年前关闭。
所以我已经在这个项目上苦苦挣扎了将近一个星期,我需要帮助。请参阅我正在尝试从三个文件中读取我的主程序:MyFileReader、MyCSVReader 和 MyMorgReader。
在我的主程序上,我试图创建一个新的模拟器以及一个新的 MorgReader,它可以从文本文件中读取并将该文本文件转换为基于文本文件的模拟器。
这是我在程序的主文件中写的:
程序.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 代码,它是“无法创建抽象类或接口(interface) 'MorgReader' 的实例,我猜最后两个问题是因为第一个问题,我不确定。我的 MorgReader 是一个抽象类,而不是一个接口(interface)。但是我试图基于我的 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*//
}
如果您需要有关我的问题的更多信息,请告诉我。我很乐意答应。我只想一劳永逸地摆脱这个错误。
先感谢您。
最佳答案
要了解为什么这不起作用,您需要更好地了解编译器试图通过错误消息告诉您的内容。
考虑在 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 方法的代码是在哪里定义的?
换句话说,当您调用这些方法时会运行什么代码?
答案是这些方法的代码没有定义,因此编译器不允许您构造抽象类。
编辑 :但是由于其他原因,该行看起来也错误,因为您没有为采用 MyCSVReader 对象的 MorgReader 定义构造函数。
关于c# - CS0144 - C# - 无法创建抽象类或接口(interface)的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40413451/