Jak zaimplementować właściwość w interfejsie


135

Mam interfejs IResourcePolicyzawierający właściwość Version. Muszę zaimplementować tę właściwość, która zawiera wartość, kod napisany na innych stronach:

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

Jak mogę wdrożyć nieruchomość version?

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

1
dlaczego chcesz zaimplementować cokolwiek w interfejsie? Tam właśnie określasz interfejs ...
— Stefan Steinegger

Odpowiedzi:


296

W interfejsie określasz właściwość:

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

W klasie implementującej musisz to zaimplementować:

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

To wygląda podobnie, ale to coś zupełnie innego. W interfejsie nie ma kodu. Po prostu określasz, że istnieje właściwość z funkcją pobierającą i ustawiającą, cokolwiek zrobią.

Na zajęciach faktycznie je wdrażasz. Najkrótszym sposobem na to jest użycie tej { get; set; }składni. Kompilator utworzy pole i wygeneruje dla niego implementację pobierającą i ustawiającą.


Jak powiesz, że Versionjest to publiczne w klasie? Ahh, widzę mój problem: jeśli zaimplementujesz interfejs bezpośrednio (np. IResourcePolicy.VersionNie możesz określić, czy jest on publiczny.
— PeterX

5
Masz rację, powinno być publiczne. Naprawiłem to. Nie obchodziło mnie to zbytnio, ponieważ nie ma to znaczenia dla rzeczy, które próbowałem wyjaśnić.
— Stefan Steinegger,

7
Oczywiście, że to istotne! Jeśli chcesz udzielić dobrej odpowiedzi, musisz ułatwić ludziom pracę. Więc nie natkną się na następny problem.
— Bitterblue

21

Masz na myśli to?

class MyResourcePolicy : IResourcePolicy {
    private string version;

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

1
to wiem, ale już przypisałem wartości takie, że irp.WrmVersion = "10,4"; zobacz moje pytanie, nie muszę tracić tej wartości, muszę to
— zaliczyć

16

Interfejsy nie mogą zawierać żadnej implementacji (w tym wartości domyślnych). Musisz przełączyć się na klasę abstrakcyjną.


W ten sposób mogę zaimplementować tę właściwość gdzie indziej
— peter

utwórz klasę @petr, która implementuje ten interfejs, niż utwórz instancję do tej klasy i przypisz do zmiennej, która ma typ interfejsu
— Arsen Mkrtchyan

4
Głosowałbym za pierwszym zdaniem. Jeśli jednak interfejs jest wystarczający, należy zawsze unikać abstrakcyjnych klas bazowych. Zanim więc dowiesz się, jaki problem powinien zostać rozwiązany, nie powinieneś sugerować tworzenia klasy bazowej.
— Stefan Steinegger

2
@Stefan, w drugim zdaniu miałem na myśli, że jeśli naprawdę potrzebuje wprowadzenia wartości domyślnej, to powinien użyć klasy abstrakcyjnej.
— Vitaliy Liptchinsky

1

Prosty przykład użycia właściwości w interfejsie:

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
  • ale już przypisałem wartości takie, że irp.WrmVersion = "10,4";

Odpowiedź J.Random Codera i pole inicjalizacji wersji.


private string version = "10.4';

0

Do zainicjowania właściwości należy użyć klasy abstrakcyjnej. Nie możesz zainicjalizować w Inteface.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.