Wyjaśnienie tematyki interfejsów i właściwości

0

Witam.

Piszę ponieważ mam problem z zrozumieniem interfejsu. Jeżeli chodzi implementowanie metod to wszystko jest dla mnie jasne, jednak w przypadku właściwości spotkałem się z sytuacją, której nie potrafię zrozumieć. Otóż w interfejsie ustawiłem właściwość, która miała być tylko do odczytu. Jednak klasa, która zaimplementowała ten interfejs, zaimplementowała get i set. Według mnie w takim wypadku kompilator powinien krzyczeć o błędzie i mówić, że właściwość Myproperty może być tylko do odczytu. Jednak się tak nie dzieje i pokazany kod działa, bez żadnych problemów. Teraz moje pytanie czemu tak się dzieje, czemu mogę dodać do właściwości MyProperty set.

interface IInterface
{
      int MyProperty { get; }
}

class Probna : IInterface
{
    private int myproperty;
    public int MyProperty
    {
        get { return myproperty; }
        set { myproperty = value; }
    }
}

Probna p = new Probna();
p.MyProperty = 5;
Console.WriteLine(p.MyProperty);
0

Wydaje mi się że wstawiłeś tą propertkę poprzez snippet propfull. W takim wypadku nic w tym dziwnego, spróbuj usunąć tą propertkę, najechać myszą na implementowany interfejs i wybierz Implement members czy coś w tym stylu.

0
dam1an napisał(a):

Wydaje mi się że wstawiłeś tą propertkę poprzez snippet propfull.

Zrobiłem to poprzez Implement interface a potem dodałem set i pole.

dam1an napisał(a):

W takim wypadku nic w tym dziwnego

Wszystko powinno działać tak samo, niezależnie czy piszemy z palca czy korzystamy z specjalnych mechanizmów, które część kodu same wstawiają.

1

Aha, no to nie to nie tak działa.
Możesz dodać sobie seter z palca tak samo jak możesz dodać nową propertkę której nie będzie w interfejsie;

interface IInterface
{
      int MyProperty { get; }
}
 
class Probna : IInterface
{
    private int myproperty;
    public int MyProperty
    {
        get { return myproperty; }
        set { myproperty = value; }
    }

    public int MyProperty2 {get;set;}
}
 
IInterface p = new Probna();
p.MyProperty = 5; //na to już ci nie pozwoli
p.Myproperty2 = 5; // na to też
Console.WriteLine(p.MyProperty);
0

Masz rację, jeśli referuje się do klasy poprzez interfejs to działa tak jak powinno, czyli tak jak pokazałeś.

Wątpliwości zostały rozwiązane, jednak ja osobiście uważam, że nie powinno się pozwalać dodawać selektorów, nawet wtedy gdy będą one widoczne tylko i wyłącznie z poziomu klasy.

Dziękuje za pomoc dam1an i proszę by moderator oznaczył temat jako rozwiązany i jeśli to możliwe to dał wymienionemu użytkownikowi łapkę w górę.

0
Świetny Młot napisał(a):

Wątpliwości zostały rozwiązane, jednak ja osobiście uważam, że nie powinno się pozwalać dodawać selektorów, nawet wtedy gdy będą one widoczne tylko i wyłącznie z poziomu klasy.

Celem interfejsu nie jest zakazanie implementacji czegoś w klasie tylko definicja kontraktu, który musi spełnić dana klasa, aby mogła zostać użyta gdzie indziej, najczęściej w jakiejś metodzie przyjmującej ten interfejs jako argument. Dla takiej metody ważne jest to, co może na swoim argumencie zrobić, czyli jakie metody i właściwości wywołać. Nie obchodzi jej to, czy klasa posiada poza tym jakieś inne metody i właściwości, ani czy implementuje jeszcze 10 innych interfejsów.
Ograniczenie, które proponujesz byłoby bardzo sztuczne i niezwykle irytujące.

1 użytkowników online, w tym zalogowanych: 0, gości: 1