从虚方法访问派生类
本文关键字:派生 访问 方法 | 更新日期: 2023-09-27 18:06:54
关于这个话题有很多问题,但我还没有找到一个满意的解决方案:
是否可能(如果是,如何?)从基虚方法访问派生类?
假设我有以下类:
public class parent_class
{
public virtual string common_method () {
dynamic child = /* something to access the derived class */ ;
if (child == null)
return typeof(parent_class).FullName;
else
return child.GetType().FullName;
}
}
public class child_class1 : parent_class {}
public class child_class2 : parent_class {}
public class child_class3 : parent_class {}
是否可以执行以下代码(并获得正确的结果)?
parent_class p = new parent_class();
child_class1 c1 = new child_class1();
child_class2 c2 = new child_class2();
child_class3 c3 = new child_class3();
System.Console.WriteLine(p.common_method()); // result: 'parent_class'
System.Console.WriteLine(c1.common_method()); // result: 'child_class1'
System.Console.WriteLine(c2.common_method()); // result: 'child_class2'
System.Console.WriteLine(c3.common_method()); // result: 'child_class3'
编辑:在阅读评论和回复后,我必须添加以下几点:
- 我有大约300个不同的"子类",所以重写不是一个选项
- 我不想打印派生类的名称-这只是一个例子
- @Siamak Ferdos:我尝试了
this
-关键字,但不知怎的没有按我的意图工作。
是的,您可以通过'this'关键字来实现:
public class parent_class
{
public virtual string common_method()
{
//dynamic child = /* something to access the derived class */ ;
if (this.GetType() == typeof(parent_class))
return typeof(parent_class).FullName;
else
return this.GetType().FullName;
}
}
public class child_class1 : parent_class { }
public class child_class2 : parent_class { }
public class child_class3 : parent_class { }
如果我正确理解了你的问题,你想通过一个通用的基类方法打印类的全名。在运行时,实际实例化的类型名称是GetType().FullName
将生成的,而不是基类的类型。
可以用一个简单的例子来测试:
void Main()
{
var parent = new Parent();
var child = new Child();
Console.WriteLine(parent.GetName());
Console.WriteLine(child.GetName());
}
public class Parent
{
public string GetName()
{
return this.GetType().FullName;
}
}
public class Child : Parent
{
}
收益率:
UserQuery+Parent
UserQuery+Child
其中UserQuery
为已定义的命名空间。
不需要在派生类中使用虚方法或重写方法。