是否可以在派生类或任何其他类中调用抽象类的方法?
本文关键字:调用 抽象类 方法 其他 任何 派生 是否 | 更新日期: 2023-09-27 18:02:21
是否可以在派生类或任何其他类中调用抽象类的方法?我的代码如下,我想在程序的Main方法中调用abstract的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
}
}
因为你的方法不是静态的,你需要从那个抽象类初始化一个变量,然后从它调用那个方法。要做到这一点,您可以通过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();
}
}
您应该能够直接使用Abstr.Describe()
。它是一个静态方法,所以类是否抽象并不重要。
编辑
现在问题中的代码已经编辑,并且在方法上删除了static
关键字,这个答案不再适用。
A:当然可以,只要它是公共的,受保护的(和相同的类或子类),或内部的(和相同的程序集)Q:是否可以在派生类中调用抽象类的方法课吗?
A:当然可以,只要它是公共的或内部的(和相同的程序集)问:还有其他类吗?
好链接:http://agsmith.wordpress.com/2007/12/15/internal-and-protected/
是可能的代码:这里
这也适用于非静态方法
调用
就足够了编辑:原来的帖子被修改了,所以这个答案是无效的。
Abstr.Describe();
问候。
可以,只要父类型中的方法定义可以被子类型访问(以及想要调用该方法的代码)。
下面是一些示例代码。是否调用子类型或超类型中的方法定义取决于如何定义重写:
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 ;
}
}