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