C# 是否可以在派生类或任何其他类中调用抽象类的方法
是否可以在派生类或任何其他类中调用抽象类的方法。下面是我的代码,我想在程序的Main方法中调用absr的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
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
修饰符指定替换(隐藏)父实现,并且在向上转换时,实例应恢复为父行为。应该注意的是,当使用覆盖定义方法或属性时,父级的版本将不再公开。