是否可以在派生类或任何其他类中调用抽象类的方法?

本文关键字:调用 抽象类 方法 其他 任何 派生 是否 | 更新日期: 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关键字,这个答案不再适用。

Q:是否可以在派生类中调用抽象类的方法课吗?

A:当然可以,只要它是公共的,受保护的(和相同的类或子类),或内部的(和相同的程序集)

问:还有其他类吗?

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