Re[7]: Свойства расширения
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.12.11 13:28
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Однако возможно этот шаг поможет найти еще сторонников из мира C#.


В Немреле столько фич, что все сторонники шарпа уже по 10 раз должны были перейти на немерл. Так что еще одна вряд ли на что-то повлияет. Плюс, чем больше фич, тем сложнее учить язык.

_NN>Я вот не понимаю зачем нужно придумывать имя переменной в методах расширения и почему нельзя было сделать как указано выше


Фарш невозможно провернуть назад. (с)

Можно подумать о более простом (и возможно, менее элегантном) решении. Например, использовать для описания свойства-расширения методы с атрибутами.

get_PropertName(this obj : Type1) : Type2
{
  ...
}

set_PropertName(this obj : Type1, value : Type2)
{
  ...
}

Тогда их можно будет вызвать как метод. А возможность обращаться к ним как к свойствам будет всего лишь небольшим синтаксическим сахаром.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Свойства расширения
От: _NN_ www.nemerleweb.com
Дата: 06.12.11 13:42
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Тогда их можно будет вызвать как метод. А возможность обращаться к ним как к свойствам будет всего лишь небольшим синтаксическим сахаром.


По сути компилятор именно это и будет генерировать. Можно для начала и так.

А можно и макрос приделать для генерации
И даже квазицитаты новые не требуются.

public static extension X : int (this m : MyClass) { get { m.Y + 1 } set { m.Y = value - 1 } }


А вариант 2 приберечь для N2 или N1.x.
Только бы не забыть о нём.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: Свойства расширения
От: Jack128  
Дата: 06.12.11 13:42
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Здравствуйте, VladD2, Вы писали:


VD>>И то, и то, как-то некузяво. Второй вариант совсем не похож на методы-расширения. Какой-то не явный параметр. Первый просто странный.


_NN>Кстати подумалось, а почему расширения не используют синтаксис

_NN>
_NN>static <ClassName>.<Method/Property/... Name> : <Type> { ... }
_NN>


_NN>Тогда бы не нужно было придумывать имя переменной, а использовался бы this.

_NN>И унификация

_NN>
_NN>public static MyClass.ExtensionMethod(p1 : Param1, p2 : Param2) : int { this.DoSomething(); }

_NN>public static MyClass.ExtensionProperty : int { get { this.X } set { this.X = value } }

_NN>public static MyClass.ExtensionEvent : MyEevnt { ... }
_NN>


_NN>


using NS1;
using NS2;

в обоих неймспейсах есть одинаковый extension метод ExtensionMethod

как вызвать ExtensionMethod из NS1??
Re[6]: Свойства расширения
От: _NN_ www.nemerleweb.com
Дата: 06.12.11 14:04
Оценка:
Здравствуйте, Jack128, Вы писали:

J>using NS1;

J>using NS2;

J>в обоих неймспейсах есть одинаковый extension метод ExtensionMethod


J>как вызвать ExtensionMethod из NS1??


Очевидно тут тоже нужен будет другой синтаксис

myObject.NS1.MyExtensions.ExtensionMethod();

А если NS1 есть у myObject, то myObject.global::NS1.MyExtensions.ExtensionMethod();

Или там придумать другой синтаксис типа: myObject.<NS1.MyExtensions.ExtensionMethod>();

P.S.
Я понимаю, нужно все продумать прежде чем бросаться в крайности.
На это и форум
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[8]: Свойства расширения
От: catbert  
Дата: 06.12.11 16:14
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Да и как вообще можно сделать события расширениями? Кто их вызвать то будет?


Кто-нибудь другой, естественно.

// без событий-расширений
SomeSingletonList.Add(x);
SomeSingletonList.Event += myHandler;

// с ними
x.Event += myHandler;


Мне кажется, библиотеки вроде Reactive Extensions очень бы выиграли от событий-расширений.
Можно конечно включить фантазию и добавить еще события с индексаторами (и соответствующие расширения), но это уж вряд ли найдет поддержку у коммьюнити
Re[8]: Свойства расширения
От: catbert  
Дата: 06.12.11 16:18
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Можно подумать о более простом (и возможно, менее элегантном) решении. Например, использовать для описания свойства-расширения методы с атрибутами.


VD>
VD>get_PropertName(this obj : Type1) : Type2
VD>{
VD>  ...
VD>}

VD>set_PropertName(this obj : Type1, value : Type2)
VD>{
VD>  ...
VD>}
VD>


А в чем, собственно, проблема? Почему нельзя использовать стандартный синтаксис индексаторов + ключевое слово this?
Re[9]: Свойства расширения
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.12.11 17:54
Оценка: +1
Здравствуйте, catbert, Вы писали:

C>А в чем, собственно, проблема? Почему нельзя использовать стандартный синтаксис индексаторов + ключевое слово this?


А в чем смысл использования синтаксиса индексаторов? Мы хотим всех запутать?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Свойства расширения
От: catbert  
Дата: 06.12.11 19:52
Оценка: 1 (1)
Здравствуйте, VladD2, Вы писали:

VD>А в чем смысл использования синтаксиса индексаторов? Мы хотим всех запутать?


Мне кажется абсолютно логичным и ничуть не запутанным использование

   public static PropertyName[this x : Type1] : Type2
   {
      ...
   }


для обозначения свойств-расширений.

Для того чтобы превратить метод класса в метод-расширение, мне нужно объявить его публичным, статическим, добавить аргумент с обозначением this, и заменить все ссылки на this внутри метода на этот аргумент.

Для того чтобы превратить свойство класса в свойство-расширение, мне нужно объявить его публичным, статическим, добавить индекс с обозначением this, и заменить все ссылки на this внутри свойства на этот аргумент.

По-моему, все симметрично и понятно. И новый синтаксис не вводится. Держу пари, что если в C# когда-нибудь введут свойства-расширения, у них будет именно такой синтаксис.
Re[11]: Свойства расширения
От: _NN_ www.nemerleweb.com
Дата: 07.12.11 07:51
Оценка:
Здравствуйте, catbert, Вы писали:

C>Здравствуйте, VladD2, Вы писали:


VD>>А в чем смысл использования синтаксиса индексаторов? Мы хотим всех запутать?


C>Мне кажется абсолютно логичным и ничуть не запутанным использование


C>
C>   public static PropertyName[this x : Type1] : Type2
C>   {
C>      ...
C>   }
C>


C>для обозначения свойств-расширений.


А свойства индексаторы как будут выглядеть?
public static PropertyName[this x : Type1] [index : int] : Type2 { .. }
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: Свойства расширения
От: Ziaw Россия  
Дата: 07.12.11 08:42
Оценка:
Здравствуйте, Jack128, Вы писали:


J>using NS1;

J>using NS2;

J>в обоих неймспейсах есть одинаковый extension метод ExtensionMethod


J>как вызвать ExtensionMethod из NS1??


Точно так же как сейчас. Статик методом с первым параметром, весь этот синтаксис все равно будет транслироваться в него. Свойства тоже должны быть странслированы в get_PropertyName/set_PropertyName, чтобы их было легко использовать из внешних библиотек.
Re[7]: Свойства расширения
От: Jack128  
Дата: 07.12.11 10:23
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, Jack128, Вы писали:



J>>using NS1;

J>>using NS2;

J>>в обоих неймспейсах есть одинаковый extension метод ExtensionMethod


J>>как вызвать ExtensionMethod из NS1??


Z>Точно так же как сейчас. Статик методом с первым параметром, весь этот синтаксис все равно будет транслироваться в него. Свойства тоже должны быть странслированы в get_PropertyName/set_PropertyName, чтобы их было легко использовать из внешних библиотек.


а сейчас в N разрешено вызывать непосредственно геттеры/сеттеры свойств? Не extension, а обычных свойств?
Re[8]: Свойства расширения
От: _NN_ www.nemerleweb.com
Дата: 07.12.11 10:28
Оценка: +1
Здравствуйте, Jack128, Вы писали:

J>а сейчас в N разрешено вызывать непосредственно геттеры/сеттеры свойств? Не extension, а обычных свойств?


Да !
http://ideone.com/nUEaT
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[12]: Свойства расширения
От: catbert  
Дата: 07.12.11 10:54
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>А свойства индексаторы как будут выглядеть?

_NN>
_NN>public static PropertyName[this x : Type1] [index : int] : Type2 { .. }
_NN>


Так же, как и обычные индексаторы с несколькими аргументами (чем индексаторы-расширения, по сути, и являются):

public static PropertyName[this x : Type1, index : int] : Type2 { .. }
Re[13]: Свойства расширения
От: _NN_ www.nemerleweb.com
Дата: 07.12.11 11:01
Оценка:
Здравствуйте, catbert, Вы писали:

Да, что-то ступил.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[11]: Свойства расширения
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.12.11 11:49
Оценка:
Здравствуйте, catbert, Вы писали:

C>Мне кажется абсолютно логичным и ничуть не запутанным использование


C>
C>   public static PropertyName[this x : Type1] : Type2
C>   {
C>      ...
C>   }
C>


C>для обозначения свойств-расширений.


А мне кажется наоборот.

Скажем, что будем делать, если нам захочется создать индексаторы-расширения?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Свойства расширения
От: BogdanMart Украина  
Дата: 07.12.11 12:47
Оценка:
Здравствуйте, VladD2, Вы писали:
VD>На практике у меня пару раз возникало желание сделать свойство-расширение. А вот события или индексеры ни разу.

VD>Да и как вообще можно сделать события расширениями? Кто их вызвать то будет?


в WPF исползуются AttachedEvent's как и AttachedProprty но нету поддержки сто тсороны С#, только с XAML

а с С# выглядит вот так:


// это  AttachedPropery  чтобы присвоить соответственно надо вызвать SetDrag
        public static readonly DependencyProperty TypeProperty = DependencyProperty.RegisterAttached("Type",
                                                                                           typeof(Type),
                                                                                           typeof(DependencyObject),
                           new PropertyMetadata((d, e) => SetTypes(d, new Type[] { (Type)e.NewValue })));

        public static void SetType(DependencyObject d, Type v)
        {
            d.SetValue(TypeProperty, v);
        }

        public static Type GetType(DependencyObject d)
        {
            return (Type)d.GetValue(TypeProperty);
        }
//А это соответсвенно аналогичный ивент
        public static readonly RoutedEvent DropEvent = EventManager.RegisterRoutedEvent("Drop", RoutingStrategy.Bubble,
                                                                                        typeof(Action<UIElement, DropEventArgs>),
                                                                                        typeof(DependencyObject));

        public static void AddDropHandler(UIElement source, Action<UIElement, DropEventArgs> handler)
        {
            source.AddHandler(DropEvent, handler);
        }

        public static void RemoveDropHandler(UIElement source, Action<UIElement, DropEventArgs> handler)
        {
            source.RemoveHandler(DropEvent, handler);
        }


Вызов из XAML весьма удобочитаем, а вот из кода работать не так удобно, так что таки надо свойства/ивенты расширения.

    <ListView x:FieldModifier="public" AllowDrop="True"
              GUICommon:DDC.Type="{x:Type SUFMonitoringClasses:TemplateFunction}"
              GUICommon:DDC.Drop="OnDrop"
              SelectionMode="Single" Name="listBoxDalls" VerticalAlignment="Stretch">
Re[9]: Свойства расширения
От: hardcase Пират http://nemerle.org
Дата: 07.12.11 13:27
Оценка:
Здравствуйте, BogdanMart, Вы писали:

BM>Вызов из XAML весьма удобочитаем, а вот из кода работать не так удобно, так что таки надо свойства/ивенты расширения.


Тому, кому захочется — элементарно засахарит макрооператором эти акцессоры для свойств и событий:

obj..Prop = value; // устанавливаем свойство
obj ++= handler;   // цепляем событие
/* иЗвиНите зА неРовнЫй поЧерК */
Re[10]: Свойства расширения
От: hardcase Пират http://nemerle.org
Дата: 07.12.11 13:28
Оценка:
Здравствуйте, hardcase, Вы писали:
H>Тому, кому захочется — элементарно засахарит макрооператором эти акцессоры для свойств и событий:

Упс (отправилось)

obj..Prop = value; // устанавливаем свойство
obj..Event += handler;   // цепляем событие
/* иЗвиНите зА неРовнЫй поЧерК */
Re[10]: Свойства расширения
От: hardcase Пират http://nemerle.org
Дата: 07.12.11 13:33
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, BogdanMart, Вы писали:


BM>>Вызов из XAML весьма удобочитаем, а вот из кода работать не так удобно, так что таки надо свойства/ивенты расширения.


Во:
obj.Prop from AttachedPropertyClass = 10;
obj.Event from AttachedPropertyClass += value;
/* иЗвиНите зА неРовнЫй поЧерК */
Re[12]: Свойства расширения
От: catbert  
Дата: 07.12.11 13:35
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А мне кажется наоборот.


VD>Скажем, что будем делать, если нам захочется создать индексаторы-расширения?


http://rsdn.ru/forum/nemerle/4529671.1.aspx
Автор: catbert
Дата: 07.12.11
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.