2016-03-06 106 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

很高兴帮助!是。如果你有一个父母和一个孩子,当你创建一个孩子对象时,你可以访问父母的方法,受保护等等。孩子总是知道它的父母...... :) –