0

我有一个 A 类和一个 B 类。 B 类是 A 类的孩子,因此:

public class Class A
{
   public DateTime FileStart
   {
      get
      {
          return Header.StartTime;
      }
      set{ }
   }
   ...
   ...
}

public class B : A
{
   FileInfo zippedA;
   public A myA = null;
   internal B(FileInfo mFileInfo)
   {
      ...
      //collects the same data as A from the fileinfo such as  start time...
      ...
   }
   public A getAData()
   {
      UnZipFile(zippedA);
      return myA;
   }
   ...
}

因此,我正在寻找一种在调用getAData()对象时B调用的方法A,例如列表 Xlist 存储所有 As 和 B,但将从代码中的多个位置访问:

   SortedList Xlist = new SortedList();
   public void GetFrames(DateTime desiredStartTime, DateTime  desiredEndTime)
   {
       for(int fileIdx = Xlist.Values.Count-1; fileIdx >= 0; --fileIdx)
       {
           //my hope is that there is a way to set up B in it's class to say
           // "if I get called as an A, I'll perform getAData() and return myA instead.
           A rec = (A)Xlist.GetByIndex(fileIdx);
           ...
           ...
       }
   }

在上面的例子中,我希望每次从 Xlist 中拉出一个对象,如果它是 B 但像这样被种姓为 A,它会自动调用getAData()函数并返回结果 A 而不是它自己。这可能吗??

4

2 回答 2

1

您可以在父类中创建该方法virtual并在子类中覆盖它。在任何地方调用类型 A 的实例的方法时,如果派生类型提供并覆盖,它将调用派生类型中的方法,否则它将调用类型 A 中的版本。

这是最简单的方法,替代方案不是很有吸引力。有关 C# 中虚拟方法的更多信息,请查看此 msdn 文章;http://msdn.microsoft.com/en-us/library/aa645767(v=vs.71).aspx

做你认为你想做的事(我很确定这实际上不是你想做的事)你可以这样做;

   for(int fileIdx = Xlist.Values.Count-1; fileIdx >= 0; --fileIdx)
   {
       A rec = (A)Xlist.GetByIndex(fileIdx);
       if (rec.GetType() == typeof(B))
       {
            B temp = (B) rec;
            rec = temp.getAData();
       }
   } 

虽然,再一次,这根本没有意义。这是一个例子;

public class Car
{
     int year;
     bool manual;
}

public class Porsche : Car
{
    bool specialPorscheOnlyFeature;
    Engine enginge;
}

public class Engine
{
   string engineType;
} 
// in some method

Porsche p = new Porsche();
// to get Car data
int yearOfCar = p.year; 
bool isManual = p.manual;
bool specialFeature = p.SpecialPorscheOnlyFeature;

以上是继承如何工作的示例。我不检索基类的实例,基类的所有内容都被烘焙到派生类的实例中。您的行为就像基类是派生类所组成的其他对象一样。

于 2013-07-01T21:45:34.340 回答
0

这可能不是最好的方法,但这行不通吗?

class File
{
    public string FileInfo = "";

    public override string ToString()
    {
        return FileInfo;
    }

    public virtual File GetRaw()
    {
        return this;
    }
}

class ZippedFile : File
{
    public File Unzip()
    {
        // Do actual unzip here..
        return new File { FileInfo = FileInfo.Substring(0,8) };
    }

    public override File GetRaw()
    {
        return Unzip();
    }
}

class Program
{
    static void Main(string[] args)
    {
        List<object> files = new List<object>();

        files.Add(new File { FileInfo = "BeepBoop" });
        files.Add(new ZippedFile { FileInfo = "BeepBoopfQAWEFRLQER:LKAR:LWEasdfw;lekfrqW:ELR" });
        files.Add(new File { FileInfo = "BoopBeep" });
        files.Add(new ZippedFile { FileInfo = "BoopBeepAWSLF:KQWE:LRKsdf;lKWEFL:KQwefkla;sdfkqwe" });

        foreach(var f in files)
        {
            File rawFile = ((File)f).GetRaw();
            Console.WriteLine(rawFile);
        }

        Console.ReadKey();
    }
}
于 2013-07-01T23:07:43.080 回答