从虚方法访问派生类

本文关键字:派生 访问 方法 | 更新日期: 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为已定义的命名空间。

不需要在派生类中使用虚方法或重写方法。