Come implementare una proprietà in un'interfaccia


135

Ho un'interfaccia IResourcePolicycontenente la proprietà Version. Devo implementare questa proprietà che contiene valore, il codice scritto in altre pagine:

IResourcePolicy irp(instantiated interface)
irp.WrmVersion = "10.4";

Come posso implementare la proprietà version?

public interface IResourcePolicy
{
   string Version
      {
          get;
          set;
      }
}

1
perché vuoi implementare qualcosa nell'interfaccia? Lì basta specificare l'interfaccia ...
Stefan Steinegger,

Risposte:


296

Nell'interfaccia, si specifica la proprietà:

public interface IResourcePolicy
{
   string Version { get; set; }
}

Nella classe di implementazione, è necessario implementarlo:

public class ResourcePolicy : IResourcePolicy
{
   public string Version { get; set; }
}

Sembra simile, ma è qualcosa di completamente diverso. Nell'interfaccia, non esiste un codice. Devi solo specificare che esiste una proprietà con un getter e un setter, qualunque cosa facciano.

Nella classe, li implementi effettivamente. Il modo più breve per farlo è utilizzare questa { get; set; }sintassi. Il compilatore creerà un campo e genererà l'implementazione getter e setter per esso.


Come dici che Versionè pubblico in classe? Ahh, vedo il mio problema: se si implementa l'interfaccia in modo esplicito (ad esempio IResourcePolicy.Version, non è possibile definire se è pubblico.
PeterX

5
Hai ragione, dovrebbe essere pubblico. L'ho riparato. Non mi importava molto di questo, perché non è rilevante per le cose che ho cercato di spiegare.
Stefan Steinegger,

7
Certo che è rilevante! Se vuoi fornire una buona risposta, devi renderla semplice per le persone. Quindi non inciampano sul prossimo problema.
Bitterblue,

21

Intendi così?

class MyResourcePolicy : IResourcePolicy {
    private string version;

    public string Version {
        get {
            return this.version;
        }
        set {
            this.version = value;
        }
    }
}

1
questo lo so ,, ma ho già assegnato valori tali che irp.WrmVersion = "10.4"; vedi la mia domanda, non ho bisogno di perdere quel valore, devo passarlo
peter

16

Le interfacce non possono contenere alcuna implementazione (inclusi i valori predefiniti). Devi passare alla classe astratta.


Ecco come posso implementare questa proprietà altrove
peter

crea una classe @petr che implementa quell'interfaccia, quindi crea un'istanza per quella classe e assegna a una variabile che ha un tipo di interfaccia
Arsen Mkrtchyan

4
Vorrei votare per la prima frase. Ma le classi di base astratte dovrebbero sempre essere evitate se un'interfaccia è sufficiente. Quindi, prima di sapere quale problema dovrebbe effettivamente essere risolto, non dovresti suggerire di creare una classe base.
Stefan Steinegger,

2
@Stefan, con la seconda frase intendevo dire che se avesse davvero bisogno di un valore predefinito per essere introdotto, allora dovrebbe usare la classe astratta.
Vitaliy Liptchinsky,

1

Il semplice esempio di utilizzo di una proprietà in un'interfaccia:

using System;
interface IName
{
    string Name { get; set; }
}

class Employee : IName
{
    public string Name { get; set; }
}

class Company : IName
{
    private string _company { get; set; }
    public string Name
    {
        get
        {
            return _company;
        }
        set
        {
            _company = value;
        }   
    }
}

class Client
{
    static void Main(string[] args)
    {
        IName e = new Employee();
        e.Name = "Tim Bridges";

        IName c = new Company();
        c.Name = "Inforsoft";

        Console.WriteLine("{0} from {1}.", e.Name, c.Name);
        Console.ReadKey();
    }
}
/*output:
 Tim Bridges from Inforsoft.
 */

0
  • ma ho già assegnato valori tali che irp.WrmVersion = "10.4";

Risposta di J.Random Coder e inizializzazione del campo versione.


private string version = "10.4';

0

È necessario utilizzare la classe astratta per inizializzare una proprietà. Non puoi inizializzare in Inteface.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.