在作为父类调用时执行子类方法

本文关键字:执行 类方法 调用 父类 | 更新日期: 2023-09-27 18:20:33

我有一个class a和一个class 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;
   }
   ...
}

因此,我正在寻找一种方法,每当B的对象被调用为A时,都可以调用getAData()。例如,列表Xlist存储所有的as和Bs,但将从代码中的几个位置访问:

   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,而不是它自己。这可能吗??

在作为父类调用时执行子类方法

您可以在父类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;

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

这可能不是最好的方法,但这不会奏效吗?

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();
    }
}