在被称为父类时执行子类方法

时间:2013-07-01 21:39:20

标签: c# visual-studio-2010 class parent-child

我有一个班级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而不是它自。这可能吗??

2 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分: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();
    }
}