2016-03-06 103 views
0

我有下面的代碼,在那裏我定義一些操作是類及其變量內完成接取數據:子類不能從父類

namespace PPF_Converter_v10 
{ 

    public class ProgramStuff 
    { 
     protected List<String> OpenedFiles { get; private set; } 
     protected List<String> ValidFiles { get; private set; } 
     protected List<String> InvalidFiles { get; private set; } 
     protected List<String> FileData { get; private set; } 
     protected string FileContents { get; private set; } 
     public ProgramStuff() 
     { 
      OpenedFiles = new List<string>(); 
      ValidFiles = new List<string>(); 
      InvalidFiles = new List<string>(); 
      FileData = new List<string>(); 
      FileContents = string.Empty; 
     } 


    public void SelectFiles() 
     { 
      using (var FileSelect = new OpenFileDialog()) 
      { 
       FileSelect.Multiselect = true; 
       FileSelect.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer); 
       FileSelect.Filter = "PPF Files (*.ppf)|*.ppf|CIP Files (*.cip)|*.cip"; 
       FileSelect.Title = "Seclect a PPF or CIP File"; 
       DialogResult dr = FileSelect.ShowDialog(); 
       if (dr == DialogResult.OK) 
       { 
        foreach(var File in FileSelect.FileNames) 
        { 
         OpenedFiles.Add(File); 
        } 
       } 
      } 
     } 
     public void ReadFiles() 
     { 
      foreach(var File in OpenedFiles) 
      { 
       using (var fs = new FileStream(File, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) 
       { 

        FileContents = string.Empty; 
        var len = (int)fs.Length; 
        var bits = new byte[len]; 
        fs.Read(bits, 0, len); 
        // Dump 1024 bytes per line 
        for (int ix = 0; ix < len; ix += 1024) 
        { 
         //drawTextProgressBar(ix, (int)fs.Length); 

         var cnt = Math.Min(1024, len - ix); 
         var line = new byte[cnt]; 
         Array.Copy(bits, ix, line, 0, cnt); 

         // Convert non-ascii characters to . 
         for (int jx = 0; jx < cnt; ++jx) 
          if (line[jx] < 0x20 || line[jx] > 0x7f) line[jx] = (byte)'.'; 
         //Creating a big string with output 
         FileContents += Encoding.ASCII.GetString(line); 
        } 
        FileData.Add(FileContents); 
       } 
      } 
     } 
     public void FileDefiniton() 
     { 
      foreach(var File in FileData) 
      { 

       bool b = File.Contains("/HDMZoneCoverageValue") && File.Contains("/CIP3AdmInkColors"); 
       if(b) 
       { 
        ValidFiles.Add(File); 
       } 
       else 
       { 
        InvalidFiles.Add(File); 
       } 
      } 

     } 
     public string XMLOutputFolder() 
     { 
      string XMLOutput = string.Empty; 
      using (var XMLOut = new FolderBrowserDialog()) 
      { 
       XMLOut.ShowNewFolderButton = true; 
       XMLOut.RootFolder = Environment.SpecialFolder.MyComputer; 
       DialogResult dr = XMLOut.ShowDialog(); 
       if(dr == DialogResult.OK) 
       { 
        XMLOutput = XMLOut.SelectedPath; 
       } 
       return XMLOutput; 
      } 
     } 
     public void ConvertedPPFFolder(string ConvertedPPF) 
     { 
      using (var ConvFolder = new FolderBrowserDialog()) 
      { 
       ConvFolder.ShowNewFolderButton = true; 
       ConvFolder.RootFolder = Environment.SpecialFolder.MyComputer; 
       DialogResult dr = ConvFolder.ShowDialog(); 
       if (dr == DialogResult.OK) 
       { 
        ConvertedPPF = ConvFolder.SelectedPath; 
       } 
      } 
     } 


    }//Closing class ProgramStuff 
    //Creating a child class called FileManipulation - manipulate files 
    public class FileManipulation: ProgramStuff 
    { 
     protected string PPFColors; 
     protected string[] ColorsNames; 

     public void ColorExtraction() 
     { 
      MessageBox.Show(ValidFiles.Count.ToString()); 

      foreach (var data in ValidFiles) 
      { 
       Regex ColorNameRegex = new Regex("CIP3AdmSeparationNames(.*)CIP3AdmPSExtent"); 
       var RegexAux = ColorNameRegex.Match(data); 
       PPFColors = RegexAux.Groups[1].ToString(); 
       PPFColors = PPFColors.Replace("] def./", "").Replace("[", "").Replace(" (", "(").Replace("(", "").Replace(")", "|"); 
       PPFColors = PPFColors.Remove(PPFColors.Length - 1, 1); 
       ColorsNames = PPFColors.Split(new[] { "|" }, StringSplitOptions.RemoveEmptyEntries); 

      } 
     } 
    } 


} 

然後,我有我的窗體聲明,其中i實例都和使用它們:

public partial class Form1 : Form 
    { 
     private FileManipulation FileOp; 
     private ProgramStuff GetFiles; 

     public Form1() 
     { 
      InitializeComponent(); 
      FileOp = new FileManipulation(); 
      GetFiles = new ProgramStuff(); 
     }  
     private void button1_Click(object sender, EventArgs e) 
     {   
      GetFiles.SelectFiles(); 
      GetFiles.ReadFiles(); 
      GetFiles.FileDefiniton(); 
     } 

的問題是:我可以做我需要使用該實例類ProgramStuff(所謂的GetFiles)的所有操作。但是,就在這裏,當我打電話給孩子的方法:

private void button5_Click(object sender, EventArgs e) 
{ 
    FileOp.ColorExtraction(); 
} 

我不能訪問存儲在父類的數據。調試時,名爲ValidFiles的List有0個元素;並且在父類上添加了元素。我能訪問這些元素嗎?這是我的問題的主要觀點。

謝謝!

+0

無法跟隨你的意圖......你認爲'GetFiles'對象上的操作會反映在'FileOp'對象內嗎?因爲您沒有顯示將數據加載到'FileOp'的'ValidFiles'的任何操作。它們是兩個*獨立*對象,其中有兩個*獨立的*對象。 –

+0

Button1_click將數據加載到ValidFiles中。這部分工作。然後,從FileOp,我想要訪問這些數據。 –

+0

這兩個對象在它們之間不共享'ValidFiles'。每個人都有自己的'ValidFiles'列表。將數據加載到'GetFiles'的'ValidFiles'列表中對'FileOp'內的列表完全沒有任何影響。我不明白你爲什麼試圖在這裏使用兩個變量。 'FileManipulation'類可以完成其父類'ProgramStuff'所能做的一切。我認爲你可以完全刪除'GetFiles'對象,而只需使用'FileOp'。 –

回答

1

我認爲你的問題是你正在實例化子類和父類: FileOp = new FileManipulation(); GetFiles = new ProgramStuff();

並且您試圖使用存儲在兩個不同對象中的數據。當我看到它時,你只需要實例化子類: FileOp = new FileManipulation();

然後你將不得不使用你的代碼調用子和父母方法的FileOp。

我希望它有幫助。

+0

我只是不能相信它就是這樣......工作就像一個魅力!太棒了!提前致謝。所以,每次我創建一個新的孩子,我將不得不實例化孩子才能訪問所有元素? –

+0

很高興幫助!是。如果你有一個父母和一個孩子,當你創建一個孩子對象時,你可以訪問父母的方法,受保護等等。孩子總是知道它的父母...... :) –