Включение кода в новый класс без наследования
От: SeLo  
Дата: 27.02.11 20:38
Оценка:
Вот мысль перед сном меня посетила:
а почему бы не иметь возможность расширять класс через включение какого-либо кода без использования наследования?

Например,

class A {
private int Sum (int a, int b) {
return a+b;
}
}

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

class B : include A {
// пользуюсь методами класса A
}

class C : include A {
// ...
}

Скомпилированный бы код включал код из класса как "родной"

Конечно, эти методы класса A скорее всего не зависели бы от внешних переменных и тем самым напоминали бы статические методы или классы расширения,
но мне кажется у такого способа есть некоторые преимущества перед последними:
— методы расширения переполняют Intellisense и появляются везде где надо и не надо.
— статические методы "открыты", а я бы хотел скрыть реализацию или испльзовать ее в ограниченном количестве классов
— что-то еще, не хочу думать

Как бы вы относитесь к такой возможности языка c#?
Re: Включение кода в новый класс без наследования
От: hi_octane Беларусь  
Дата: 27.02.11 20:56
Оценка: 4 (1)
SL>Скомпилированный бы код включал код из класса как "родной"

SL>Конечно, эти методы класса A скорее всего не зависели бы от внешних переменных и тем самым напоминали бы статические методы или классы расширения,

А можно чтобы они содержали в себе ещё и переменные, которые бы тоже включались в наследника...

Ты практически придумал Mixin. Нужен ещё интерфейс, иначе не получится сделать приведение типов. Как компилятору приводить класс C к типу A, если он объявлен как C : B, include A. Так что нужно чтобы A был объявлен как реализующий некий (оптимально если выводящийся из самого объявления A) интерфейс IA.

SL>Как бы вы относитесь к такой возможности языка c#?

В C# не думаю что эта фича появится — ибо надобность в ней не столь велика. Вон memberof или infoof добавить не могут. Ну и само собой — в Nemerle уже есть, притом делается хоть пятью способами. Но честно говоря мы на здоровенный проект только несколько раз таким образом шарили код между классами, так что даже синтаксис вроде include не вводили, чисто копирующий аттрибут на скорую руку слепили.
Re[2]: Включение кода в новый класс без наследования
От: Аноним  
Дата: 27.02.11 21:49
Оценка:
_>Ты практически придумал Mixin. Нужен ещё интерфейс, иначе не получится сделать приведение типов. Как компилятору приводить класс C к типу A, если он объявлен как C : B, include A. Так что нужно чтобы A был объявлен как реализующий некий (оптимально если выводящийся из самого объявления A) интерфейс IA.
Точно, глянул на термин mixin — это оно. А вот про приведение типов — можно было бы и проще, хватило бы включения кода на этапе компиляции

_>В C# не думаю что эта фича появится — ибо надобность в ней не столь велика.

Не конкретезируя, где именно, но у меня надобность возникала уже несколько раз. Иначе бы и не додумался до этого
Re: Включение кода в новый класс без наследования
От: henson Россия http://www.njt-rails.com
Дата: 28.02.11 15:10
Оценка:
Здравствуйте, SeLo, Вы писали:

SL>Вот мысль перед сном меня посетила:

SL>а почему бы не иметь возможность расширять класс через включение какого-либо кода без использования наследования?

SL>Скомпилированный бы код включал код из класса как "родной"


SL>Конечно, эти методы класса A скорее всего не зависели бы от внешних переменных и тем самым напоминали бы статические методы или классы расширения,

SL>но мне кажется у такого способа есть некоторые преимущества перед последними:
SL>- методы расширения переполняют Intellisense и появляются везде где надо и не надо.
SL>- статические методы "открыты", а я бы хотел скрыть реализацию или испльзовать ее в ограниченном количестве классов
SL>- что-то еще, не хочу думать

SL>Как бы вы относитесь к такой возможности языка c#?


Не имею ничего против самой концепции, но тоже самое можно сделать и другими способами. Зачем городить еще один?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.