在基类对象上使用子类方法
本文关键字:类方法 基类 对象 | 更新日期: 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();