Właściwość abstrakcyjna a definicja w interfejsie.

0

Dlaczego gdy w klasie abstrakcyjnej zdefiniuję abstrakcyjną właściwość z get, to w implementacji nie mogę rozszerzyć o set, gdy w interefejsie mogę?
Jak czytałem o klasach abstrakcyjnych i interfejsach, to nic takiego nie było wspominane. Zaskoczenie.

2

Właściwość jest skróconym zapisem metod do zapisywania i/lub odczytywania pola w klasie, np. zdefiniowanie właściwości public int Property { get; set; } powoduje wygenerowanie przez kompilator C# prywatnego pola typu int i publicznych metod o nazwach get_Property i set_Property. Nadpisując wirtualną właściwość bez settera, tak naprawdę nadpisuje się metodę get_Property. Nie ma znaczenia, czy ta klasa jest abstrakcyjna, czy konkretna. Nie można nadpisać metody set_Property, bo nie ma takiej metody w klasie bazowej. Można przesłonić właściwość za pomocą słowa kluczowego new i zdefiniować w niej dodatkowo setter i/lub nawet zrezygnować z gettera, ale w takim przypadku traci się możliwość korzystania z zalet polimorfizmu. W klasie implementującej interfejs jest możliwość dodania settera, gdy nie ma go w definicji interfejsu, bo interfejs dostarcza minimalne wymagania dla klasy go implementującej.

0

Logiczne. Dzięki.

A jak nie ważne czy implementuje po abstrakcyjnej czy interfejsie, to gdy nie ma settera zmienna jest wtedy readonly? Zawsze? Bo to w sumie też ciekawe.

0
Zakręcony Lew napisał(a):

A jak nie ważne czy implementuje po abstrakcyjnej czy interfejsie, to gdy nie ma settera zmienna jest wtedy readonly? Zawsze? Bo to w sumie też ciekawe.

Jeśli właściwość jest nieautomatyczna, to po utworzeniu obiektu można zmienić jej wartość zmieniając wartość pola lub pól, z którymi jest związana (jeśli te pola nie są tylko do odczytu). A jeśli jest automatyczna, to można zmienić jej wartość tylko w konstruktorze klasy lub podczas jej definiowania, czyli zachowuje się tak, jak pole tylko do odczytu. Jeśli klasa definiuje właściwość z getterem i setterem, ale interfejs definiuje właściwość z samym getterem, to odwołując się do obiektu tej klasy za pomocą referencji typu tego interfejsu nie możesz zmienić wartości tej właściwości (bo interfejs definiuje publiczne API, w którym ta właściwość nie ma settera). Nie wiem, czy dobrze zrozumiałem Twoje pytanie.

0

Te pojęcia różnią się od tych z Java. Jest więcej możliwości.
Trochę się pogubiłem, ale już chyba rozumiem.
Dzięki.

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