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

时间:2011-07-18 18:32:35

标签: c# oop abstract-class

是否可以在派生类或任何其他类中调用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
    }
}

6 个答案:

答案 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 ;
  }
}
相关问题