Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以在派生类或任何其他类中调用抽象类的方法_C#_Oop_Abstract Class - Fatal编程技术网

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

C# 是否可以在派生类或任何其他类中调用抽象类的方法,c#,oop,abstract-class,C#,Oop,Abstract Class,是否可以在派生类或任何其他类中调用抽象类的方法。下面是我的代码,我想在程序的Main方法中调用absr的descripe()方法。 可能吗?如果答案是肯定的,怎么办 class Program { public void Main() { //I want to call the Describe() method here, how do i do that Console.ReadLine(); } } public abstract

是否可以在派生类或任何其他类中调用抽象类的方法。下面是我的代码,我想在程序的Main方法中调用absr的
descripe()
方法。 可能吗?如果答案是肯定的,怎么办

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

您应该能够直接使用
absr.descripe()
。它是一个静态方法,因此抽象的类应该无关紧要

编辑 既然问题中的代码已被编辑,并且方法上的
static
关键字已被删除,此答案不再适用。

调用就足够了

编辑:

原来的帖子被改了,所以这个答案是无效的

 Abstr.Describe();

关于。

是的,可能是代码:

这也适用于非静态方法

问:是否可以在派生类中调用抽象类的方法 上课

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

问:还有别的课吗

答:当然可以,只要它是公共的或内部的(和相同的程序集)

好链接:

由于您的方法不是静态的,因此需要从该抽象类初始化一个变量并从中调用该方法。为此,您可以通过concreate类继承抽象类,然后调用该方法。请注意,抽象类无法初始化并抛出类似
absr absr=new absr()的构造函数无效。因此:

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

可以,只要子类型(以及要调用该方法的代码)可以访问超类型中的方法定义

下面是一些示例代码。是否调用子类型或超类型中的方法定义取决于重写的定义方式:

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

你有没有试过,但却遇到了问题?如果你不断修改你的示例代码,没有人能帮你。此外,它还可以帮助您发布任何错误的文本。这就省去了我们追根究底的麻烦,因为当你有信息时,我们会试图找到一个答案。这是不公平的,我没料到你会这么做site@Pradeep-你到底期望什么?你有几十个问题,所以这不是你第一次寻求帮助。如果它是一个非静态类该怎么办?该方法是静态的,因此它可以在没有类实例的情况下访问。任何类都可以包含静态方法,但是静态类只能包含静态方法,不能包含任何其他方法。如果在代码中Main和descripe都是非静态的,那么您发布的
Main
descripe
都有
static
关键字,因此这些方法是静态的。因此,我的答案就过时了。如果您需要帮助,请确保您发布了相关代码,最好是通过测试并验证您是否得到了所描述的错误,然后复制粘贴该代码。我们可以使用新关键字创建抽象类的实例吗?:)不,但既然我扩展了它,我就可以创建自己的实例并获得所需的函数luityso Program:lol,这样我就可以用lol的所有方法制作一个程序了。做Concrete absr=new Concrete()不是更有意义吗@Ramhound:我想向hem演示如何初始化\使用
Abstr
实例。如何调用AbstractSupertype.Charlie?在子类型中,您可以使用sez,
base.Charlie()
。关键字修饰符
override
表示您的子类型正在替换(专门化)父类型的方法/属性,并且该专门化即使在向上转换实例时也存在。相反,
new
修饰符指定替换(隐藏)父实现,并且在向上转换时,实例应恢复为父行为。应该注意的是,当使用
覆盖定义方法或属性时,父级的版本将不再公开。