![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Dims |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Хочу написать интерфейс public interface INumbersetWritable<T> : INumberset<T> который добавляет к уже существующему в предке свойству сеттер (там был только геттер).
Было так:
написал так
думал, get уже есть в предке и надо только set добавить, а она ругается, мол, что затеняешь функцию, используй new. Как правильно написать? |
||||
|
|||||
| diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
в последней версии можно так
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
||||
|
|||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Вопрос был в другом. Если в предке только геттер, то как сделать, чтобы в потомке был и геттер и сеттер.
Я так понял, что это невозможно и что так и было задумано. |
|||
|
||||
| elbjarn |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 13.4.2008 Где: Дубна Репутация: 1 Всего: 3 |
это логично - если предок позволяет только считывать значение свойства, было бы весьма странно, если бы потомки позволяли в него и записывать |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Просто свойства рассматривается не как два самостоятельных метода, а как единый член типа. В васике например свойствам вообще добавляются ReadOnly и WrightOnly. Изменение этого положения само собой приведёт к созданию нового свойства. Для того, чтобы свойство можно было переопределить сигнатуры должны совпадать.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
Dims, это глюк наследования интерфейсов. Точнее, не глюк - наследие COM/IDispatch
, в котором были точно такие же ограничения. .NET совместим c COM в обе стороны, могли специально сделать глюк ради священной коровы МС. Ну есть еще всякие домыслы, типа: "readonly проперти должно быть readonly по своему смыслу и добавление к нему сеттера на самом деле есть затенение первоначального смысла". Или "не изобретай велосипед, возьми стандартные интерфейс ICollection<T> и используй ReadOnlyCollection<T> для non-writable." Но их можно смело игнорировать. При реализации интерфейса в классе таких ограницений нет. |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Дело в том, что в Джаве нет языкового понятия свойства, там есть просто договорённость, что если ты называешь методы set-чего-то-там и/или get-чего-то-там, то это сеттер и геттер свойства "чего-то-там".
Естественно, точно так же можно сделать и в Сидиез, то есть, договориться. И тогда станет очевидно, что ради цельности концепции нужно было разрешить наследование по отдельности, поскольку Сишное свойство ничем принципиально не отличается от Джавного. То есть, нужно было трактовать сеттер и геттер как два отдельных метода, потому что это и есть два отдельных метода. Про COM понял. Про классы тоже понял. |
|||
|
||||
| kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 3 Всего: 160 |
Dims, я дико извиняюсь за оффтоп... Почитал Ваши темы и вот что. Название языка, который Вы начали изучать (C#) произносится Си Шарп! И никаких там
Так, просто, на будущее... -------------------- |
|||
|
||||
| PashaPash |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
Дело в том, что в C# и вообще .net свойство - это не пара функций, которые разработчики договорились называть с set_ и get_. Это одна запись в метаданных и две функции, которые должны следовать определенным правилам (с 24 по 28 в спеке). Поменять половину записи в метаданных довольно проблематично - в случае наследования. А вот создать новую, и привязать к ней методы интерфейса по имени - как в случае реализации интерфейса - вполне можно. Ну и вообще, в дотнете интерфейсы не наследуются. В дотнете есть понятие Interface type derivation - в твоем случае INumbersetWritable не наследуется от INumberset, он просто требует чтобы класс реализовал еще и INumberset.
Это сообщение отредактировал(а) PashaPash - 4.11.2008, 19:04 |
||||
|
|||||
| diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Вопрос в том, что мешает в базовом классе сделать так
а в производном переопределить свойство?
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
||||
|
|||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
В процитированном Вами отрывке написано, в русском переводе, буквально следующее: "Майкрософтовский C# (читается Си диез) это новый язык программирования, разработанный..." # это значок диеза, sharp это по английски диез. В этом тексте просто написано, как называется значок # (диез) для тех, кто этого не знает. Добавлено через 2 минуты и 53 секунды
А в чём разница кроме терминологии? Интерфейс -- это всё равно нечто предельно абстрактное. Если к старым требованиям добавляются новые, то чем это не наследование? Добавлено через 4 минуты и 12 секунд Естественно, я примерно так и сделал. Выбросил какое-то исключение. Но это же workaraund. |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Вот как-то даже сразу не заметил
Зачем же такие крайности то? И в связи с тем, что ента дело в подпись вынесено - просто интересно: а самому-то сколько(хотябы больше 30 или меньше)? PS А замечание то уместное(я о предыдущем сообщении). По аглицки то оно и вправду шарп произносится, странно было бы ожидать, чтобы в английском тексте написали, что произносить надо по-русски. Другой вопрос: уместно ли вообще переводить название языка программирования. Ну в таком случае зачем ограничиваться только одним словом, когда можно поговорить о чистоте русского языка. Это сообщение отредактировал(а) diadiavova - 4.11.2008, 23:46 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| kemiisto |
|
||||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 3 Всего: 160 |
Значок # (sharp) и ♯ (диез) вообще говоря различны. В таблице символов Юникод есть специальный символ для диеза «♯» (шестнадцатеричный номер 266F), который отличается от символа октоторпа (решётки) «#». C♯ - до диез (нота), C# - си-шарп (ЯП). Wiki
-------------------- |
||||
|
|||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Тут ещё интерсно
Добавлено через 9 минут и 2 секунды Да, и кстати: в таблице символов внизу пишется название символов. Так вот про символ 266f написано
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| diadiavova |
|
||||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Пардон - сразу не заметил. Вот, что сделал я :
В главной форме разместил кнопку и текстовое поле. Вписал следующий код
При запуске в поле было написано Blablalbla. После нажатия кнопки New value. То есть значение свойству было присвоено, несмотря на то, что в базовом классе сеттер пустой. Думаю дело не в А скорее в -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
||||||
|
|||||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | .NET для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |