2013-05-14 20 views
9

Kiedy zdefiniować interfejs, który zawiera zapisu tylko właściwość:Czy można jawnie zastosować narzędzie ustawiające obiekty, gdy getter jest publicznie dostępny?

public interface IModuleScreenData 
{ 
    string Name { set; } 
} 

i próbę (naiwnie) wdrożyć go jawnie z zamiarem na własność, aby mieć również publicznie dostępne getter:

public class ModuleScreen : IModuleScreenData 
{ 
    string IModuleScreenData.Name { get; set; } 
} 

następnie pojawia się następujący błąd:

Error 'IModuleScreenData.Name.get' adds an accessor not found in interface member 'IModuleScreenData.Name'

błąd jest mniej lub bardziej spodziewane, jednak po tej alternatywnej składni:

public class ModuleScreen : IModuleScreenData 
{ 
    public string Name { get; IModuleScreenData.set; } 
} 

nie udało się skompilować, przypuszczam, że to, co próbuję zrobić, nie jest możliwe. Mam rację, czy też jest jakaś tajna składnia sosu ?

Odpowiedz

10

Można to zrobić:

public class ModuleScreen : IModuleScreenData 
{ 
    string IModuleScreenData.Name 
    { 
     set { Name = value; } 
    } 

    public string Name { get; private set; } 
} 

W zakładach notatka boczna, generalnie nie zalecałbym właściwości typu "tylko zestaw". Metoda może działać lepiej, aby wyrazić zamiar.

+0

Zgadzam się z uwagą boczną, ale na odwrót - interfejs z właściwością tylko do odczytu, zaimplementowaną przez klasę, która tworzy ta własność, którą można zapisać -, dla której również twoje rozwiązanie jest odpowiednie, jest bardziej akceptowalna i prawdopodobnie znacznie powszechniejsza. –

+0

Dzięki za to ... –

-1

Nie można zmienić sposobu implementacji interfejsu na liście dziedziczącej. Właśnie o to chodzi. Jeśli musisz zrobić coś nowego za pomocą właściwości, możesz utworzyć nową właściwość, która odwołuje się do implementacji właściwości odziedziczonych właściwości. Dostępne są interfejsy, dzięki czemu można dostosować się do określonego standardu dziedziczenia obiektów.

UPDATE: Na drugim myśli .. powinieneś być w stanie po prostu to zrobić .... będzie to skompilować grzywny:

public class ModuleScreen : IModuleScreenData 
    { 
     public string Name { get; set; } 
    } 
+0

Chciałbym uniknąć tworzenia nowej nieruchomości, jeśli to możliwe. Nie jestem pewien, co masz na myśli, zmieniając sposób implementacji interfejsu - rozumiem, że muszę spełnić umowę zawartą w interfejsie, a jednoznaczne wdrożenie to jeden ze sposobów, aby to zrobić. –

+0

Zobacz moją aktualizację ... powinieneś być w stanie po prostu dodać interfejs get i spełniają – miskiw