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;
      }
}
Piotr
źródło
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ą.

Stefana Steineggera
źródło
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;
        }
    }
}
J. Random Coder
źródło
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ą.

Vitaliy Liptchinsky
źródło
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.
 */
Bernard Czaiński
źródło
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';
kazuk
źródło
0

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

Abdus Salam Azad
źródło