| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > А как добавить сеттер к свойству? |
| Автор: Dims 3.11.2008, 23:49 | ||||
| Хочу написать интерфейс public interface INumbersetWritable<T> : INumberset<T> который добавляет к уже существующему в предке свойству сеттер (там был только геттер). Было так:
написал так
думал, get уже есть в предке и надо только set добавить, а она ругается, мол, что затеняешь функцию, используй new. Как правильно написать? |
| Автор: diadiavova 4.11.2008, 01:14 | ||||
в последней версии можно так
|
| Автор: Dims 4.11.2008, 04:57 |
| Вопрос был в другом. Если в предке только геттер, то как сделать, чтобы в потомке был и геттер и сеттер. Я так понял, что это невозможно и что так и было задумано. |
| Автор: diadiavova 4.11.2008, 13:10 |
| Просто свойства рассматривается не как два самостоятельных метода, а как единый член типа. В васике например свойствам вообще добавляются ReadOnly и WrightOnly. Изменение этого положения само собой приведёт к созданию нового свойства. Для того, чтобы свойство можно было переопределить сигнатуры должны совпадать. |
| Автор: PashaPash 4.11.2008, 14:11 |
| Dims, это глюк наследования интерфейсов. Точнее, не глюк - наследие COM/IDispatch , в котором были точно такие же ограничения. .NET совместим c COM в обе стороны, могли специально сделать глюк ради священной коровы МС. Ну есть еще всякие домыслы, типа: "readonly проперти должно быть readonly по своему смыслу и добавление к нему сеттера на самом деле есть затенение первоначального смысла". Или "не изобретай велосипед, возьми стандартные интерфейс ICollection<T> и используй ReadOnlyCollection<T> для non-writable." Но их можно смело игнорировать. При реализации интерфейса в классе таких ограницений нет. |
| Автор: Dims 4.11.2008, 18:05 |
| Дело в том, что в Джаве нет языкового понятия свойства, там есть просто договорённость, что если ты называешь методы set-чего-то-там и/или get-чего-то-там, то это сеттер и геттер свойства "чего-то-там". Естественно, точно так же можно сделать и в Сидиез, то есть, договориться. И тогда станет очевидно, что ради цельности концепции нужно было разрешить наследование по отдельности, поскольку Сишное свойство ничем принципиально не отличается от Джавного. То есть, нужно было трактовать сеттер и геттер как два отдельных метода, потому что это и есть два отдельных метода. Про COM понял. Про классы тоже понял. |
| Автор: kemiisto 4.11.2008, 18:15 | ||
Dims, я дико извиняюсь за оффтоп... Почитал Ваши темы и вот что. Название языка, который Вы начали изучать (C#) произносится Си Шарп! И никаких там
Так, просто, на будущее... |
| Автор: PashaPash 4.11.2008, 19:00 | ||||
Дело в том, что в C# и вообще .net свойство - это не пара функций, которые разработчики договорились называть с set_ и get_. Это одна запись в метаданных и две функции, которые должны следовать определенным правилам (с 24 по 28 в спеке). Поменять половину записи в метаданных довольно проблематично - в случае наследования. А вот создать новую, и привязать к ней методы интерфейса по имени - как в случае реализации интерфейса - вполне можно. Ну и вообще, в дотнете интерфейсы не наследуются. В дотнете есть понятие Interface type derivation - в твоем случае INumbersetWritable не наследуется от INumberset, он просто требует чтобы класс реализовал еще и INumberset.
|
| Автор: diadiavova 4.11.2008, 19:56 | ||||
Вопрос в том, что мешает в базовом классе сделать так
а в производном переопределить свойство?
|
| Автор: Dims 4.11.2008, 23:28 | ||
В процитированном Вами отрывке написано, в русском переводе, буквально следующее: "Майкрософтовский C# (читается Си диез) это новый язык программирования, разработанный..." # это значок диеза, sharp это по английски диез. В этом тексте просто написано, как называется значок # (диез) для тех, кто этого не знает. Добавлено через 2 минуты и 53 секунды
А в чём разница кроме терминологии? Интерфейс -- это всё равно нечто предельно абстрактное. Если к старым требованиям добавляются новые, то чем это не наследование? Добавлено через 4 минуты и 12 секунд Естественно, я примерно так и сделал. Выбросил какое-то исключение. Но это же workaraund. |
| Автор: diadiavova 4.11.2008, 23:39 | ||
Вот как-то даже сразу не заметил
Зачем же такие крайности то? И в связи с тем, что ента дело в подпись вынесено - просто интересно: а самому-то сколько(хотябы больше 30 или меньше)? PS А замечание то уместное(я о предыдущем сообщении). По аглицки то оно и вправду шарп произносится, странно было бы ожидать, чтобы в английском тексте написали, что произносить надо по-русски. Другой вопрос: уместно ли вообще переводить название языка программирования. Ну в таком случае зачем ограничиваться только одним словом, когда можно поговорить о чистоте русского языка. |
| Автор: kemiisto 5.11.2008, 00:25 | ||||
Значок # (sharp) и ♯ (диез) вообще говоря различны. В таблице символов Юникод есть специальный символ для диеза «♯» (шестнадцатеричный номер 266F), который отличается от символа октоторпа (решётки) «#». C♯ - до диез (нота), C# - си-шарп (ЯП). http://ru.wikipedia.org/wiki/CSharp
|
| Автор: diadiavova 5.11.2008, 00:32 | ||
| http://www.abbyyonline.ru/translate.aspx?CardId=434;43e;20;434;438;435;437;0;4c;69;6e;67;76;6f;55;6e;69;76;65;72;73;61;6c;20;28;52;75;2d;45;6e;29 Добавлено через 9 минут и 2 секунды Да, и кстати: в таблице символов внизу пишется название символов. Так вот про символ 266f написано
|
| Автор: diadiavova 5.11.2008, 01:25 | ||||||
Пардон - сразу не заметил. Вот, что сделал я :
В главной форме разместил кнопку и текстовое поле. Вписал следующий код
При запуске в поле было написано Blablalbla. После нажатия кнопки New value. То есть значение свойству было присвоено, несмотря на то, что в базовом классе сеттер пустой. Думаю дело не в А скорее в |
| Автор: Dims 5.11.2008, 14:33 | ||
Всё правильно, у Вас же mcc имеет тип MyChildClass, а у него сеттер не пустой. |
| Автор: diadiavova 5.11.2008, 20:30 |
| Ну так ясный перец не пустой. Вопрос был: как добавить сеттер. Это ответ. Если речь о том, как добавить сеттер к ридонли свойству - тогда ответ один - затенение Или я чего-то не понял? |
| Автор: PashaPash 5.11.2008, 20:37 | ||||||
В том и проблема, что не добавляются методы.
В интерфейсе A один метод, и в интерфейсе B один метод. И класс может реализовать отдельно A и отдельно B. Скажем, B - implicitly, а А - explicitly:
И тогда у класса C будет public метод MethodB, но не будет метода MethodA. Свойства, которые как бы цельный объект с точки зрения CLR, такого не переживут. Более того, если ты объявляешь свойство с тем же именем в B, то оно не дополнит свойство из A, а просто потребует от С реализовать два свойства с одинаковым именем, о чем тебя и предупреждает компилятор. |