在作为父类调用时执行子类方法
本文关键字:执行 类方法 调用 父类 | 更新日期: 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();
}
}