从虚方法访问派生类

时间:2015-08-08 12:01:27

标签: c# inheritance

虽然存在很多关于这个主题的问题,但我还是找不到令人满意的解决方案:

从基础虚拟方法访问派生类是否可能(如果是,如何?)

让我们假设我有以下几个类:

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 - 关键字,但它在某种程度上无法按我的意图运作。

2 个答案:

答案 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是定义的名称空间。

在派生类中,不需要将该方法设置为虚拟或覆盖,以使其工作。