2015-07-06 43 views
0

我有两个抽象类AbstractClass1AbstractClass2,它们都应具有相同的方法名称Meth1在具有相同函数名的另一个抽象类中继承抽象类

现在如果我的AbstractClass1继承自AbstractClass2。目前它给我编译时间错误为"Hides Inherited Abstract Member"。以下是我的代码。

abstract class AbstractClass1 : AbstractClass2 
{ 
    public abstract string Meth1(); 
} 

abstract class AbstractClass2 
{ 
    public abstract string Meth1(); 
} 
+2

因为这两种方法都是抽象的存在** **没有理由在你的'AbstractClass1'给予'new'声明在所有 - 是什么你真的想要做什么? – Carsten

+0

如果'AbstractClass1'扩展'AbstractClass2',为什么需要再次声明该方法? – Glorfindel

+0

你驾驶室重写AbstractClass1.But中的Meth1()。为什么你需要这种类型的声明? – Joseph

回答

-2

这里的问题是,你试图隐藏一个抽象方法与另一个。 比方说,你真行与该代码:

abstract class A { abstract void Method(); } 
abstract class B : A { abstract void Method(); } 
class C : B { public void Method() { Console.Write("Hello"); } 

你有两个抽象方法,因为B类的方法隐藏从A级方法只有一种实现。 A类或B类实施哪种方法?

从MSDN引述

成员标记为抽象的或包括在一个抽象类,必须通过从抽象类

https://msdn.microsoft.com/en-us/library/sf985hc5.aspx

+0

不正确 - 您可以选择。如果你的课堂只是再次抽象,不要实现抽象成员 - 试试吧 – Carsten

+0

请看这里:http://csharppad.com/gist/62925596605b1d2abd68 – Carsten

+0

是的,我知道。但在你的例子中,你并没有试图用新的同名抽象方法取代抽象方法。你可以继承抽象类的抽象方法当然,但无论如何,你必须在具体类的某个地方实现你的方法。 – Fabjan

2

派生的类被 实现试试这个

abstract class AbstractClass1 : AbstractClass2 
{ 
} 


abstract class AbstractClass2 
{ 
    public abstract string Meth1(); 
} 
3

您可以在派生类方法上使用abstract override以避免编译时错误。

abstract class BaseAbstract 
{ 
    public abstract string Meth1(); 
} 

abstract class ChildAbstract : BaseAbstract 
{ 
    public abstract override string Meth1(); 
} 

请注意这是不使用abstract override相当正确的地方。 通常在从非抽象类派生抽象类时使用抽象重写。以确保派生类实现该方法。 (见this

看看下面的代码

class BaseNonAbstract 
{ 
     public virtual string Meth1() 
     { 
     // do something 
     return string.Empty; 
     } 
} 
abstract class ChildAbstract : BaseNonAbstract 
{ 
    public abstract override string Meth1(); 
}