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

本文关键字:类方法 基类 对象 | 更新日期: 2023-09-27 17:58:22

假设我已经声明了以下类:

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实例,如果url使得Create返回SubClass实例,则baseClass is SubClass将返回true

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

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

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"
    }
}

如果基类没有实现是没有意义的,那么将类和方法声明为抽象的——这将强制派生类重写该方法,从而保证任何实例化的类实例都将具有有效的实现。

我不知道你为什么要这么做?
BaseClass的实例的类型不可能等于SubClass的类型

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

如果将baseClass设置为BaseClass,则无法将该方法调用为SubClass,但如果编写

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

它将在定义CCD_ 17时调用该方法。

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

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

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

所以要么

class BaseClass{
    /* properties, constructors, getters, setters etc. */
    virtual public void Method(){
    /* some code here */
    }
}

 ((SubClass)baseClass).Method();