2016-11-04 399 views
-1

所以我一直在這個項目上掙扎的一個實例,我需要幫助。看到我試圖讓我的主程序從三個文件中讀取:MyFileReader,MyCSVReader和MyMorgReader。CS0144 - C# - 不能爲近一個星期現在創建抽象類或接口

在我的主程序,我試圖用一個新的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*// 
} 

請讓我知道如果你需要米關於我的問題的礦石信息。我很樂意承認。我只是想徹底擺脫這個錯誤。

預先感謝您。

+2

爲什麼'MorgReader'是一個抽象類?如果將其抽象化是有意義的,爲什麼要嘗試實例化它?此外,請嘗試只包含代碼的相關部分(在這種情況下,'MorgReader'(你不包括)),並且只有引起錯誤的行'MorgReader mr = new MorgReader(new MyCSVReader(new FileReader(「 C:\\ Users \\ miiwo \\ Dropbox \\ Morg.txt「)));') – Rob

+0

'MorgReader'是抽象的,也就是說它的方法只是一個沒有實現的簽名。如果你調用'mr.Read()',你正在調用一個沒有實現的方法,這就是爲什麼當你試圖創建一個抽象類的實例時,編譯器會產生一個錯誤。你爲什麼試圖直接創建一個'MorgReader'而不是'MyCSVReader'? – KMoussa

+1

也見http://stackoverflow.com/questions/16342494/why-abstract-class-cannot-be-instantiated-what-is-the-use-of-a-class-which-cann,http:// stackoverflow .com/questions/2308786/abstract-classes-and-interfaces-in-c-sharp,http://stackoverflow.com/questions/6611412/cannot-create-an-instance-of-the-abstract-class-or -接口 – Fiddles

回答

0

請刪除ReaderDecorator類中的abstract關鍵字,並將其與主程序一起用於啓動讀取器,因爲您無法使用新關鍵字啓動抽象類。

MorgReader mr = new ReaderDecorator (new MyCSVReader(new FileReader("C:\\Users\\miiwo\\Dropbox\\Morg.txt"))); 
0

要理解這是爲什麼不工作,你需要更好地瞭解它想告訴你用錯誤消息的編譯器。

考慮這行代碼在計劃中。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(); 

在上面,其中將用於代碼閱讀關閉方法的代碼來定義?

換句話說,當你調用這些方法時將運行什麼代碼?

答案是這些方法的代碼沒有定義,因此編譯器不允許你構造一個抽象類的原因。

編輯:但該行看起來也錯出於其他原因,你不定義爲MorgReader,需要一個MyCSVReader對象的構造。