2009-08-27 54 views
6

我有沒能解決一個奇怪的問題。當我嘗試編譯以下剪斷,我得到這個錯誤:C#屬性

「抽象類」不實現接口成員「財產」(編譯器錯誤CS0535)

聯機幫助告訴我,使我的抽象類的抽象,它是。有人可以告訴我我哪裏錯了?

乾杯呂迪格

public interface IBase { 
    string Property { get; } 
} 

public abstract class AbstractClass : IBase 
{ 
    public override string ToString() 
    { 
     return "I am abstract"; 
    } 
} 

public class ConcreteClass : AbstractClass 
{ 
    string Property { 
     get { 
      return "I am Concrete"; 
     } 
    } 
} 

回答

19

AbstractClass需要從IBase接口提供一個實現了Property,即使它只是抽象本身:

public abstract class AbstractClass : IBase 
{ 
    public override string ToString() 
    { 
     return "I am abstract"; 
    } 

    public abstract string Property { get; } 
} 

更新:路是正確的,因爲具體的實現將需要指定Property是一個覆蓋,否則你會得到一個「沒有實現繼承的抽象成員」的錯誤:

public class ConcreteClass : AbstractClass 
{ 
    public override string Property { 
     get { 
      return "I am Concrete"; 
     } 
    } 
} 
+1

謝謝你,這顯然解決它。我仍然想知道爲什麼,它似乎是與通常的方式斷開接口在抽象類中處理。 – 2009-08-27 12:39:58

+0

你是什麼意思?你的抽象類的一個子類不一定需要知道它實現了IBase,它應該只是看到它可能/必須實現的虛擬和抽象成員。 – dahlbyk 2009-08-27 12:44:26

+3

您還需要用'override'修飾符在'ConcreteClass'上聲明'Property'。 – LukeH 2009-08-27 12:47:39

2

抽象類應該實現IBASE包含屬性,並且您還沒有實現它

1

您需要實現IBASE -property 物業這樣的:

public abstract class AbstractClass : IBase 
{ 
    public override string Property() 
    { 
     return "This is the base-class implementation"; 
    } 
} 

或使其抽象

2

你抽象類確​​實不是實現接口IBase。只需將Property添加到AbstractClass即可。

public abstract String Property { get; } 
1

您必須在抽象類中實現Property屬性。

3

你必須抽象實現屬性添加到您的抽象類:

public abstract class AbstractClass : IBase 
{ 
    public override string ToString() 
    { 
     return "I am abstract"; 
    } 

    public abstract string Property { get; } 

} 

以及越權關鍵字的具體類

2

您需要AbstractClass這樣聲明Property它滿足IBase合同。

如果您希望ConcreteClass能夠覆蓋Property那麼您應該聲明它爲abstractvirtual。然後,你需要聲明ConcreteClass實施Propertyoverride

public interface IBase 
    { 
     string Property { get; } 
    } 

    public abstract class AbstractClass : IBase 
    { 
     public abstract string Property { get; } 

     public override string ToString() 
     { 
      return "I am abstract"; 
     } 
    } 

    public class ConcreteClass : AbstractClass 
    { 
     public override string Property 
     { 
      get 
      { 
       return "I am Concrete"; 
      } 
     } 
    }