class A //А реализует анонимный интерфейс I{Test:void -> int}
{
public int Test(){return 0;}
}
void Test(obj)//I{Test:void -> int} -> void
{
int i = obj.Test();
}
void Test2(obj)//I{Test:void -> int;Test2:void -> int} -> void
{
int i = obj.Test();
int k = obj.Test2();
}
var obj = new A();
Test(A);//OK
Test2(A);//ошибка компиляции
Здравствуйте, dotneter, Вы писали:
D>Что бы как то так:
D>
D>class A //А реализует анонимный интерфейс I{Test:void -> int}
D>{
D> public int Test(){return 0;}
D>}
D>void Test(obj)//I{Test:void -> int} -> void
D>{
D> int i = obj.Test();
D>}
D>void Test2(obj)//I{Test:void -> int;Test2:void -> int} -> void
D>{
D> int i = obj.Test();
D> int k = obj.Test2();
D>}
D>var obj = new A();
D>Test(A);//OK
D>Test2(A);//ошибка компиляции
D>
Так пойдёт ?
class A //А реализует анонимный интерфейс I{Test:void -> int}
{
public:
int Test(){return 0;}
};
template <typename T>
void Test(T obj)
{
int i = obj.Test();
}
template <typename T>
void Test2(T obj)
{
int i = obj.Test();
int k = obj.Test2();
}
int main()
{
D>A *obj = new A;
D>Test(*obj);//OK
D>Test2(*obj);//ошибка компиляции, ещё и стэк инстанцирования покажет
}
В общем да, хотя конечно предполагался какой нибудь фя.
Пара вопросов:
Этим в плюсах часто пользуются?
Продвинутые IDE при запросе сигнатуры такой функции что нибудь вразумительное говорят о содержании типа T?
M>Ничего не напоминает?
?
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, dotneter, Вы писали:
К>Хаскелл, что ли?
Из моих попыток его изучения я могу вспомнить что там нужно явно указывать реализуемые интерфейсы.
А хочется что бы наподобие типа функции int -> int, был тип класса как перечень публичных методов и свойств, аля анонимный интерфейс.
dotneter wrote:
> В общем да, хотя конечно предполагался какой нибудь фя. > Пара вопросов: > Этим в плюсах часто пользуются? > Продвинутые IDE при запросе сигнатуры такой функции что нибудь > вразумительное говорят о содержании типа T?
А как ты себе это представляешь? Может в качестве типа T когда-нибудь кто-нибудь и подсунет тот, у которого есть и Test() и Test2(). Иначе можно просто именовать интерфейс и "свести задачу к предыдущей" .
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, dotneter, Вы писали:
D>В общем да, хотя конечно предполагался какой нибудь фя.
Шаблоны и есть ФЯ, только времени компиляции. Вообще мне самому интересно посмотреть где ещё есть эдакий duck typing времени компиляции. D>Пара вопросов: D>Этим в плюсах часто пользуются?
Зависит от того, на сколько часто встречается код, который требует такого обобщения. Например весь STL, кое что в boost'е. Обильное использование шаблонов может незаметно привести к дикому времени компиляции и размеру кода. Но вообще это естественное выражение компромиса между размером кода и его скоростью. D>Продвинутые IDE при запросе сигнатуры такой функции что нибудь вразумительное говорят о содержании типа T?
ХЗ, я не видел. А что они могут вообще сказать? Ведь пока я не напишу t.foo(), никаких ограничений на t не накладывается.
M>>Ничего не напоминает? D>?
Ну C++, вдруг бы ты не узнал сразу .
dotneter wrote:
> .>А как ты себе это представляешь? > > Здравствуйте, Mazay, Вы писали: > > M>ХЗ, я не видел. А что они могут вообще сказать? > > Хотелось что бы они сказали что у T должно быть реализованы такие то > функции.
А почему нельзя обычный интерфейс сделать?
class InterfaceA
{
public int Test() = 0;
};
class InterfaceA2: public InterfaceA
{
public int Test2() = 0;
};
class A : public InterfaceA
{
public int Test(){return 0};
};
void Test(InterfaceA &obj)
{
int i = obj.Test();
};
void Test2(InterfaceA2 &obj)
{
int i = obj.Test();
int k = obj.Test2();
}
int main()
{
A *obj = new A; // тут ругнётся, что в A нет Test2
}
Что ты хочешь от анонимности?
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ., Вы писали:
.>dotneter wrote:
.>А почему нельзя обычный интерфейс сделать?
Можно. Только вот
2 функции 3 интерфейса
3 функции 7 интерфейсов
...
.>Что ты хочешь от анонимности?
Писать меньше букв.
dotneter wrote:
> .>А почему нельзя обычный интерфейс сделать? > Можно. Только вот > 2 функции 3 интерфейса > 3 функции 7 интерфейсов
Наследуй интерфейсы друг от друга, делай множественное наследование от разных интерфейсов...
> .>Что ты хочешь от анонимности? > Писать меньше букв.
А можно более жизненный пример?
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ., Вы писали:
.>dotneter wrote:
>> .>А почему нельзя обычный интерфейс сделать? >> Можно. Только вот >> 2 функции 3 интерфейса >> 3 функции 7 интерфейсов .>Наследуй интерфейсы друг от друга, делай множественное наследование от разных интерфейсов...
Как это повлияет на количество интерфейсов? Если мне нужно установить соглашение на какую либо комбинацию из 3 функции, это будет интерфейс со своим названием.
>> .>Что ты хочешь от анонимности? >> Писать меньше букв. .>А можно более жизненный пример?
Примеры использования template <typename T> чем не подходят?
dotneter wrote:
> .>Наследуй интерфейсы друг от друга, делай множественное наследование от > разных интерфейсов... > Как это повлияет на количество интерфейсов? Если мне нужно установить > соглашение на какую либо комбинацию из 3 функции, это будет интерфейс со > своим названием.
class I1
{
f1() = 0;
};
class I2
{
f2() = 0;
};
class I3
{
f3() = 0;
};
template<typename T>
void test2_3(T &obj)
{
// будет обламываться во время компиляции, если T не реализует ифейс.
static_cast<I2&>(obj);
static_cast<I3&>(obj);
...
obj.f2();
obj.f3();
...
// а можно даже так:
I2 &obji2 = static_cast<I2&>(obj);
I3 &obji3 = static_cast<I3&>(obj);
obji2.f2();// тут автокомплит разарботает
}
>> > .>Что ты хочешь от анонимности? >> > Писать меньше букв. > .>А можно более жизненный пример? > Примеры использования template <typename T> чем не подходят?
Потому что элементарно переписывается с обычными ифейсами, без "лишних букв".
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, dotneter, Вы писали:
D>Что бы как то так..
Есть один замечательный функциональный язык как Вам нужен!
Вот код на OCaml:
class aaa =
object
method test = 0 (* тип этого метода будет выведен автоматически: unit->int (unit это void) *)
end;;
let test1 obj = (* test1 и test2 - функции, чей тип тоже будет выведен, равно как и тип аргумента *)
let i = obj#test in i+1;;
let test2 obj =
let i = obj#test
and k = obj#test2 in i+k;;
let obj = new aaa in
let a = test1 obj
and b = test2 obj in a+b;;
Компилятор ругается на последнюю строчку и говорит:
This expression has type aaa but is here used with type
< test : int; test2 : int; .. >
The first object type has no method test2
Т.е. требуемый интерфейс был выведен, но в нужном месте не обнаружен.
Здравствуйте, ., Вы писали:
.>Потому что элементарно переписывается с обычными интерфейсами, без "лишних букв".
Переписывается то оно переписывается, но у вас
class I1
{
f1() = 0;
};
class I2
{
f2() = 0;
};
class I3
{
f3() = 0;
};
template<typename T>
void test2_3(T &obj)
{
// будет обламываться во время компиляции, если T не реализует ифейс.
static_cast<I2&>(obj);
static_cast<I3&>(obj);
...
obj.f2();
obj.f3();
}
Здравствуйте, Mckey, Вы писали:
M>Здравствуйте, Mckey, Вы писали:
Да, вот это похоже на анонимные интерфейс, только вот если методов штуки три это уже получится какой то монстр а не объявление метода. Вывести он эту информацию не может?
Здравствуйте, dotneter, Вы писали:
D>Здравствуйте, Mckey, Вы писали:
M>>Здравствуйте, Mckey, Вы писали:
D>Да, вот это похоже на анонимные интерфейс, только вот если методов штуки три это уже получится какой то монстр а не объявление метода. Вывести он эту информацию не может?
Тогда либо делайте интерфейсы именнованными, либо умеряйте свои желания..