2009-08-27 16 views
6

Ho uno strano problema che non ho potuto risolvere. Quando provo a compilare il seguente stato tagliato ottengo questo errore:C# Proprietà in classi base astratte

'AbstractClass' non implementa il membro di interfaccia 'Proprietà' (Errore del compilatore CS0535)

La guida in linea mi dice di fare il mio AbstractClass astratta, che si è. Qualcuno può dirmi dove ho sbagliato?

Acclamazioni Rüdiger

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

risposta

19

vostre AbstractClass deve fornire un'implementazione per Property dall'interfaccia IBase, anche se è solo astratta stessa:

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

    public abstract string Property { get; } 
} 

Aggiornamento: Luca è corretto affermare che il l'implementazione concreta dovrà specificare che Property è un override, altrimenti si otterrà un errore "non implementa un membro astratto ereditato":

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

Grazie, questo ovviamente lo risolve. Mi sto ancora chiedendo perché, sembra essere una rottura con il solito modo in cui le interfacce vengono gestite in classi astratte. –

+0

Come intendi?Una sottoclasse della classe astratta non deve necessariamente sapere che implementa IBase, dovrebbe solo vedere membri virtuali e astratti che può/deve implementare. – dahlbyk

+3

Dovrai inoltre dichiarare 'Property' su' ConcreteClass' con il modificatore 'override'. – LukeH

2

AbstractClass si suppone per implementare IBase che contiene proprietà, e non hanno implementato

1

È necessario implementare il IBase -property Proprietà come questo:

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

Oppure farlo estratto.

2

Si classe astratta non non implementare l'interfaccia IBase. Basta aggiungere la proprietà Property a AbstractClass.

public abstract String Property { get; } 
1

È necessario implementare proprietà Proprietà della classe astratta.

3

si deve aggiungere astratta attuazione della proprietà alla AbstractClass:

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

    public abstract string Property { get; } 

} 

E la parola chiave override alla classe Concrete

2

è necessario dichiarare Property in AbstractClass modo che soddisfa il contratto IBase .

Se si desidera ConcreteClass per essere in grado di ignorare Property allora si dovrebbe dichiararla come abstract o virtual. Quindi dovrai dichiarare l'implementazione ConcreteClass di Property con override.

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"; 
      } 
     } 
    } 
Problemi correlati