Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> А как добавить сеттер к свойству? 
V
    Опции темы
Dims
Дата 3.11.2008, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Хочу написать интерфейс public interface INumbersetWritable<T> : INumberset<T> который добавляет к уже существующему в предке свойству сеттер (там был только геттер). 

Было так:

Код

public interface INumberset<T> : IEnumerable<T>
    {
        T this[int i] { get; }


написал так

Код

public interface INumbersetWritable<T> : INumberset<T>, ICloneable
    {
        T this[int i] { set;  }



думал, get уже есть в предке и надо только set добавить, а она ругается, мол, что затеняешь функцию, используй new.

Как правильно написать?
PM MAIL   Вверх
diadiavova
Дата 4.11.2008, 01:14 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Код

string tralala
    {
         get
           {
               //Здесь код геттера
            }
          set
            {
               //Здесь код сеттера
             }

     }


в последней версии можно так
Код

string tralala { get; set; }



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Dims
Дата 4.11.2008, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Вопрос был в другом. Если в предке только геттер, то как сделать, чтобы в потомке был и геттер и сеттер.

Я так понял, что это невозможно и что так и было задумано. 
PM MAIL   Вверх
elbjarn
Дата 4.11.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 13.4.2008
Где: Дубна

Репутация: 1
Всего: 3



Цитата(Dims @  4.11.2008,  04:57 Найти цитируемый пост)
Вопрос был в другом. Если в предке только геттер, то как сделать, чтобы в потомке был и геттер и сеттер.

Я так понял, что это невозможно и что так и было задумано.  

это логично - если предок позволяет только считывать значение свойства, было бы весьма странно, если бы потомки позволяли в него и записыватьsmile. работая с полиморфными коллекциями, где элементы производных и базовых классов представлены объектами самого базового класса, как бы можно было определить, допустимо ли присваивание значения его свойству или нет? smile

PM MAIL ICQ   Вверх
diadiavova
Дата 4.11.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Просто свойства рассматривается не как два самостоятельных метода, а как единый член типа. В васике например свойствам вообще добавляются ReadOnly и WrightOnly. Изменение этого положения само собой приведёт к созданию нового свойства. Для того, чтобы свойство можно было переопределить сигнатуры должны совпадать.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
PashaPash
Дата 4.11.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Dims, это глюк наследования интерфейсов. Точнее, не глюк - наследие COM/IDispatch
, в котором были точно такие же ограничения. .NET совместим c COM в обе стороны, могли специально сделать глюк ради священной коровы МС.
Ну есть еще всякие домыслы, типа: "readonly проперти должно быть readonly по своему смыслу и добавление к нему сеттера на самом деле есть затенение первоначального смысла". Или "не изобретай велосипед, возьми стандартные интерфейс ICollection<T> и используй ReadOnlyCollection<T> для non-writable." Но их можно смело игнорировать.

При реализации интерфейса в классе таких ограницений нет.


--------------------
PM MAIL WWW   Вверх
Dims
Дата 4.11.2008, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Дело в том, что в Джаве нет языкового понятия свойства, там есть просто договорённость, что если ты называешь методы set-чего-то-там и/или get-чего-то-там, то это сеттер и геттер свойства "чего-то-там".

Естественно, точно так же можно сделать и в Сидиез, то есть, договориться.

И тогда станет очевидно, что ради цельности концепции нужно было разрешить наследование по отдельности, поскольку Сишное свойство ничем принципиально не отличается от Джавного. То есть, нужно было трактовать сеттер и геттер как два отдельных метода, потому что это и есть два отдельных метода. 

Про COM понял. Про классы тоже понял.
PM MAIL   Вверх
kemiisto
Дата 4.11.2008, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Dims, я дико извиняюсь за оффтоп... Почитал Ваши темы и вот что. Название языка, который Вы начали изучать (C#) произносится Си Шарп! И никаких там 
Цитата(Dims @  4.11.2008,  16:05 Найти цитируемый пост)
Сидиез

Цитата
Microsoft C# (pronounced C sharp) is a new programming language designed for building a wide range of enterprise applications that run on the .NET Framework.

Так, просто, на будущее...


--------------------
PM MAIL WWW GTalk Jabber   Вверх
PashaPash
Дата 4.11.2008, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Цитата(Dims @  4.11.2008,  18:05 Найти цитируемый пост)

Естественно, точно так же можно сделать и в Сидиез, то есть, договориться.

Дело в том, что в C# и вообще .net свойство - это не пара функций, которые разработчики договорились называть с set_ и get_. Это одна запись в метаданных и две функции, которые должны следовать определенным правилам (с 24 по 28 в спеке). Поменять половину записи в метаданных довольно проблематично - в случае наследования. А вот создать новую, и привязать к ней методы интерфейса по имени - как в случае реализации интерфейса - вполне можно.
Ну и вообще, в дотнете интерфейсы не наследуются. В дотнете есть понятие Interface type derivation - в твоем случае INumbersetWritable не наследуется от INumberset, он просто требует чтобы класс реализовал еще и INumberset.
Цитата(spec 8.9.11)
To highlight the last difference, consider an interface, IFoo, that has a single method. An interface, IBar, which
derives from it, is requiring that any object type that supports IBar also support IFoo. It does not say anything
about which methods IBar itself will have.


Это сообщение отредактировал(а) PashaPash - 4.11.2008, 19:04


--------------------
PM MAIL WWW   Вверх
diadiavova
Дата 4.11.2008, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Вопрос в том, что мешает в базовом классе сделать так
Код

        public virtual string myProp
        {
            get
            {
                return "blablabla";
            }
            set { }

        }

а в производном переопределить свойство?
Код

 public override string myProp
        {
            get
            {
                return base.myProp;
            }
           set
            {
                //код сеттера
            }
        }



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Dims
Дата 4.11.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Цитата(kemiisto @  4.11.2008,  18:15 Найти цитируемый пост)
Так, просто, на будущее... 

В процитированном Вами отрывке написано, в русском переводе, буквально следующее:

"Майкрософтовский C# (читается Си диез) это новый язык программирования, разработанный..."

# это значок диеза, sharp это по английски диез. В этом тексте просто написано, как называется значок # (диез) для тех, кто этого не знает.

Добавлено через 2 минуты и 53 секунды
Цитата(PashaPash @  4.11.2008,  19:00 Найти цитируемый пост)
INumbersetWritable не наследуется от INumberset, он просто требует чтобы класс реализовал еще и INumberset.

А в чём разница кроме терминологии? Интерфейс -- это всё равно нечто предельно абстрактное. Если к старым требованиям добавляются новые, то чем это не наследование?

Добавлено через 4 минуты и 12 секунд
Цитата(diadiavova @  4.11.2008,  19:56 Найти цитируемый пост)
Вопрос в том, что мешает в базовом классе сделать так

Естественно, я примерно так и сделал. Выбросил какое-то исключение. Но это же workaraund. 
PM MAIL   Вверх
diadiavova
Дата 4.11.2008, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Вот как-то даже сразу не заметил

Цитата(kemiisto @  4.11.2008,  18:15 Найти цитируемый пост)
Any man who is under 30, and is not a liberal, has no heart; and any man who is over 30, and is not a conservative, has no brains. (Winston Churchill)


Зачем же такие крайности то?

И в связи с тем, что ента дело в подпись вынесено - просто интересно: а самому-то сколько(хотябы больше 30 или меньше)?

PS
А замечание то уместное(я о предыдущем сообщении). По аглицки то оно и вправду шарп произносится, странно было бы ожидать, чтобы в английском тексте написали, что произносить надо по-русски.
Другой вопрос: уместно ли вообще переводить название языка программирования. Ну в таком случае зачем ограничиваться только одним словом, когда можно поговорить о чистоте русского языка. smile



Это сообщение отредактировал(а) diadiavova - 4.11.2008, 23:46


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
kemiisto
Дата 5.11.2008, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(Dims @  4.11.2008,  21:28 Найти цитируемый пост)
# это значок диеза, sharp это по английски диез. В этом тексте просто написано, как называется значок # (диез) для тех, кто этого не знает.

Значок # (sharp) и ♯ (диез) вообще говоря различны. В таблице символов Юникод есть специальный символ для диеза «♯» (шестнадцатеричный номер 266F), который отличается от символа октоторпа (решётки) «#». C♯ - до диез (нота), C# - си-шарп (ЯП).
Wiki
Цитата

C# (произносится си-шарп)...



--------------------
PM MAIL WWW GTalk Jabber   Вверх
diadiavova
Дата 5.11.2008, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Тут ещё интерсно

Добавлено через 9 минут и 2 секунды
Да, и кстати: в таблице символов внизу пишется название символов. Так вот про символ 266f написано
Цитата

Music Sharp Sign



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 5.11.2008, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(Dims @  4.11.2008,  23:28 Найти цитируемый пост)
Естественно, я примерно так и сделал. Выбросил какое-то исключение. Но это же workaraund.  

Пардон - сразу не заметил.
Вот, что сделал я :
Код

  public class MyBaseClass
    {
        public virtual string myProp
        {
            get
            {
                return _myProp;
            }
            set { }
        }
        protected string _myProp = "Blablabla";    
    }

    public class MyChildClass:MyBaseClass

    {
        public override string myProp
        {
            get
            {
                return base.myProp;
            }
            set
            {
                base._myProp = value;
            }
        }    
    }


В главной форме разместил кнопку и текстовое поле. Вписал следующий код
Код

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.textBox1.Text = mcc.myProp;
        }
        MyChildClass mcc = new MyChildClass();
         //Обработчик нажатия кнопки
        private void button1_Click(object sender, EventArgs e)
        {
            
            mcc.myProp = "New Value";
            this.textBox1.Text = mcc.myProp;
        }

    
    
    }
  


При запуске в поле было написано Blablalbla. После нажатия кнопки New value.
То есть значение свойству было присвоено, несмотря на то, что в базовом классе сеттер пустой.

Думаю дело не в 
Цитата(Dims @  4.11.2008,  23:28 Найти цитируемый пост)
Но это же workaraund.

А скорее в 
Цитата(Dims @  4.11.2008,  23:28 Найти цитируемый пост)
примерно




--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0603 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.