在基类对象上使用子类方法

时间:2011-06-05 13:31:42

标签: c#

假设我已宣布以下课程:

class BaseClass{
    /* properties, constructors, getters, setters etc. */

    public static BaseClass Create(string url){
    /*will return, depending on url, a BaseClass or a SubClass object*/
    }

    public void Method(){
    /* some code here */
    }
}

class SubClass: BaseClass{
    /* other properties, constructors, getters, setters etc. */

    new public void Method(){
    /* some other code here */
    }
}

现在,在我的主要方法中,我想做一些事情:

BaseClass baseClass = BaseClass.Create(url);
if(baseClass.GetType()==typeof(SubClass)){ 
    baseClass.Method();
}

这里的想法当然是在Method中使用SubClass。这可能是一个愚蠢的问题,但我该怎么做?我不能将基类强制转换为子类,所以我不确定......

修改

澄清了我的问题。即使baseClass被声明为BaseClass实例,如果baseClass is SubClass true返回url实例,Create将返回SubClass

4 个答案:

答案 0 :(得分:2)

嗯,我不知道你为什么要那样做?
BaseClass实例的类型无法与SubClass的类型相同。

只有在您创建SubClass的实例然后将其强制转换为BaseClass时才能实现这一点。但在这种情况下,您可以将其强制转回SubClass以致电Method()

答案 1 :(得分:2)

看起来您可能正在寻找多态性,但我无法从描述中确定。您正在尝试做什么的具体用例是什么?

class BaseClass{

    public virtual void Method(){
        Console.WriteLine("BaseClass");
    }
}

class SubClass : BaseClass{
    /* other properties, constructors, getters, setters etc. */

    public override void Method(){
        Console.WriteLine("SubClass");
    }
}

static class Test
{
    public void go() {
        BaseClass instance = new SubClass();
        instance.Method(); // prints "SubClass"
    }
}

如果基类具有实现没有意义,那么declare the class and the method as abstract - 这会强制派生类重写该方法,从而保证任何实例化的类实例都具有有效的实现。 / p>

答案 2 :(得分:1)

如果您将baseClass实例化为BaseClass,则无法将该方法称为SubClass,但如果您编写

BaseClass baseClass = new SubClass();
if (baseClass is SubClass)
{
    SubClass subClass = baseClass as SubClass;
    subClass.Method();
}

它会在定义SubClass时调用该方法。

答案 3 :(得分:0)

首先:你必须将你的变量初始化为SubClass的一个实例,否则就没办法了。

然后在基类virtual中声明方法,

将对象强制转换为SubClass,并以此方式调用Method。

所以要么

class BaseClass{
    /* properties, constructors, getters, setters etc. */

    virtual public void Method(){
    /* some code here */
    }
}

 ((SubClass)baseClass).Method();