假设我已宣布以下课程:
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
。
答案 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();