是否可以在派生类或任何其他类中调用Abstract类的方法。我的代码如下,我想在Program的Main方法中调用Abstr的Describe()
方法。
可能吗?如果答案是肯定的?
class Program
{
public void Main()
{
//I want to call the Describe() method here, how do i do that
Console.ReadLine();
}
}
public abstract class Abstr
{
public void Describe()
{
//do something
}
}
答案 0 :(得分:9)
由于您的方法不是静态的,您需要从该抽象类初始化一个变量并从中调用该方法。为此,您可以通过concreate类继承抽象类,然后调用该方法。请注意,无法初始化抽象类抛出像Abstr abstr = new Abstr();
这样的构造函数无效。所以:
public abstract class Abstr
{
public void Describe()
{
//do something
}
}
public class Concrete : Abstr
{
/*Some other methods and properties..*/
}
class Program
{
public void Main()
{
Abstr abstr = new Concrete();
abstr.Describe();
Console.ReadLine();
}
}
答案 1 :(得分:4)
您应该可以直接使用Abstr.Describe()
。它是一个静态方法,因此抽象的类应该无关紧要。
现在问题中的代码已经过编辑,并且方法中删除了static
关键字,此答案不再适用。
答案 2 :(得分:1)
问:是否可以在派生中调用Abstract类的方法 类?
答:当然,只要它是公共的,受保护的(和相同的类或子类),或内部(和相同的程序集)
问:还有其他课吗?
答:当然,只要它是公开的或内部的(和相同的程序集)
良好的链接: http://agsmith.wordpress.com/2007/12/15/internal-and-protected/
答案 3 :(得分:0)
这就足够了
编辑:
原帖已更改,因此此答案无效。
Abstr.Describe();
问候。
答案 4 :(得分:0)
是的,可能是代码:here
这适用于非静态方法
答案 5 :(得分:0)
是的,只要超类型中的方法定义可以访问子类型(以及想要调用该方法的代码)。
这是一些示例代码。是否调用子类型或超类型中的方法定义取决于如何定义覆盖:
public abstract class AbstractSupertype
{
public void Alpha()
{
Console.WriteLine( "AbstractSupertype.Alpha()" ) ;
return ;
}
public abstract void Bravo() ;
public virtual void Charlie()
{
Console.WriteLine( "AbstractSupertype.Charlie()" ) ;
return ;
}
}
public class ConcreteSubtype : AbstractSupertype
{
public new void Alpha()
{
Console.WriteLine( "ConcreteSubtype.Alpha()" ) ;
}
public override void Bravo()
{
Console.WriteLine( "ConcreteSubtype.Bravo()" ) ;
}
public override void Charlie()
{
Console.WriteLine( "ConcreteSubtype.Charlie()" ) ;
}
}
class Program
{
static void Main( string[] args )
{
ConcreteSubtype subTypeInstanceReference = new ConcreteSubtype() ;
AbstractSupertype superTypeInstanceReference = subTypeInstanceReference ;
subTypeInstanceReference.Alpha() ; // invokes subtype's method
superTypeInstanceReference.Alpha() ; // invokes supertype's method
subTypeInstanceReference.Bravo() ; // invokes subtype's method
superTypeInstanceReference.Bravo() ; // invokes subtype's method
subTypeInstanceReference.Charlie() ; // invokes subtype's method
superTypeInstanceReference.Charlie() ; // invokes subtype's method
return ;
}
}