虽然存在很多关于这个主题的问题,但我还是找不到令人满意的解决方案:
从基础虚拟方法访问派生类是否可能(如果是,如何?)
让我们假设我有以下几个类:
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'
编辑:在阅读评论和回复后,我必须添加以下几点:
this
- 关键字,但它在某种程度上无法按我的意图运作。答案 0 :(得分:1)
是的,您可以通过'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 { }
答案 1 :(得分:0)
如果我正确理解您的问题,您希望通过公共基类方法打印类全名。在运行时,实际实例化类型名称是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
是定义的名称空间。
在派生类中,不需要将该方法设置为虚拟或覆盖,以使其工作。