Существует ли язык с выводом интерфейсов?
От: dotneter  
Дата: 21.04.08 08:46
Оценка:
Что бы как то так:

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);//ошибка компиляции
Talk is cheap. Show me the code.
Re: Существует ли язык с выводом интерфейсов?
От: Mazay Россия  
Дата: 21.04.08 09:01
Оценка: 2 (1)
Здравствуйте, 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);//ошибка компиляции, ещё и стэк инстанцирования покажет
}

Ничего не напоминает?
Главное гармония ...
Re: Существует ли язык с выводом интерфейсов?
От: Mckey Россия  
Дата: 21.04.08 09:14
Оценка:
Насколько я знаю такое можно делать в Scala-е...
Делай добро и бросай его в воду...
Re[2]: Существует ли язык с выводом интерфейсов?
От: dotneter  
Дата: 21.04.08 09:50
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Так пойдёт ?


В общем да, хотя конечно предполагался какой нибудь фя.
Пара вопросов:
Этим в плюсах часто пользуются?
Продвинутые IDE при запросе сигнатуры такой функции что нибудь вразумительное говорят о содержании типа T?

M>Ничего не напоминает?

?
Talk is cheap. Show me the code.
Re: Существует ли язык с выводом интерфейсов?
От: Кодт Россия  
Дата: 21.04.08 09:51
Оценка:
Здравствуйте, dotneter, Вы писали:

Хаскелл, что ли?
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: Существует ли язык с выводом интерфейсов?
От: dotneter  
Дата: 21.04.08 10:07
Оценка:
Здравствуйте, Кодт, Вы писали:

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


К>Хаскелл, что ли?


Из моих попыток его изучения я могу вспомнить что там нужно явно указывать реализуемые интерфейсы.
А хочется что бы наподобие типа функции int -> int, был тип класса как перечень публичных методов и свойств, аля анонимный интерфейс.
Talk is cheap. Show me the code.
Re[3]: Существует ли язык с выводом интерфейсов?
От: . Великобритания  
Дата: 21.04.08 10:18
Оценка:
dotneter wrote:

> В общем да, хотя конечно предполагался какой нибудь фя.

> Пара вопросов:
> Этим в плюсах часто пользуются?
> Продвинутые IDE при запросе сигнатуры такой функции что нибудь
> вразумительное говорят о содержании типа T?
А как ты себе это представляешь? Может в качестве типа T когда-нибудь кто-нибудь и подсунет тот, у которого есть и Test() и Test2(). Иначе можно просто именовать интерфейс и "свести задачу к предыдущей" .
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Существует ли язык с выводом интерфейсов?
От: Mazay Россия  
Дата: 21.04.08 10:19
Оценка:
Здравствуйте, dotneter, Вы писали:

D>В общем да, хотя конечно предполагался какой нибудь фя.

Шаблоны и есть ФЯ, только времени компиляции. Вообще мне самому интересно посмотреть где ещё есть эдакий duck typing времени компиляции.
D>Пара вопросов:
D>Этим в плюсах часто пользуются?
Зависит от того, на сколько часто встречается код, который требует такого обобщения. Например весь STL, кое что в boost'е. Обильное использование шаблонов может незаметно привести к дикому времени компиляции и размеру кода. Но вообще это естественное выражение компромиса между размером кода и его скоростью.
D>Продвинутые IDE при запросе сигнатуры такой функции что нибудь вразумительное говорят о содержании типа T?
ХЗ, я не видел. А что они могут вообще сказать? Ведь пока я не напишу t.foo(), никаких ограничений на t не накладывается.

M>>Ничего не напоминает?

D>?
Ну C++, вдруг бы ты не узнал сразу .
Главное гармония ...
Re[4]: Существует ли язык с выводом интерфейсов?
От: dotneter  
Дата: 21.04.08 10:30
Оценка:
Здравствуйте, ., Вы писали:
.>А как ты себе это представляешь?

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

M>ХЗ, я не видел. А что они могут вообще сказать?


Хотелось что бы они сказали что у T должно быть реализованы такие то функции.
Talk is cheap. Show me the code.
Re[5]: Существует ли язык с выводом интерфейсов?
От: . Великобритания  
Дата: 21.04.08 11:14
Оценка:
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
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: Существует ли язык с выводом интерфейсов?
От: dotneter  
Дата: 21.04.08 11:41
Оценка:
Здравствуйте, ., Вы писали:

.>dotneter wrote:


.>А почему нельзя обычный интерфейс сделать?

Можно. Только вот
2 функции 3 интерфейса
3 функции 7 интерфейсов
...

.>Что ты хочешь от анонимности?

Писать меньше букв.
Talk is cheap. Show me the code.
Re[7]: Существует ли язык с выводом интерфейсов?
От: . Великобритания  
Дата: 21.04.08 12:16
Оценка:
dotneter wrote:

> .>А почему нельзя обычный интерфейс сделать?

> Можно. Только вот
> 2 функции 3 интерфейса
> 3 функции 7 интерфейсов
Наследуй интерфейсы друг от друга, делай множественное наследование от разных интерфейсов...

> .>Что ты хочешь от анонимности?

> Писать меньше букв.
А можно более жизненный пример?
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[8]: Существует ли язык с выводом интерфейсов?
От: dotneter  
Дата: 21.04.08 13:02
Оценка:
Здравствуйте, ., Вы писали:

.>dotneter wrote:


>> .>А почему нельзя обычный интерфейс сделать?

>> Можно. Только вот
>> 2 функции 3 интерфейса
>> 3 функции 7 интерфейсов
.>Наследуй интерфейсы друг от друга, делай множественное наследование от разных интерфейсов...
Как это повлияет на количество интерфейсов? Если мне нужно установить соглашение на какую либо комбинацию из 3 функции, это будет интерфейс со своим названием.

>> .>Что ты хочешь от анонимности?

>> Писать меньше букв.
.>А можно более жизненный пример?
Примеры использования template <typename T> чем не подходят?
Talk is cheap. Show me the code.
Re[9]: Существует ли язык с выводом интерфейсов?
От: . Великобритания  
Дата: 21.04.08 14:43
Оценка:
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
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: Существует ли язык с выводом интерфейсов?
От: Mckey Россия  
Дата: 21.04.08 15:21
Оценка:
Здравствуйте, Mckey, Вы писали:

M>Насколько я знаю такое можно делать в Scala-е...


Называеться структурные типы...
Вот пример:

Structural types

It is now possible to declare structural types using type refinements. For example:

class File(name: String) {
  def getName(): String = name
  def open() { /*..*/ }
  def close() { println("close file") }
}
def test(f: { def getName(): String }) { println(f.getName) }

test(new File("test.txt"))
test(new java.io.File("test.txt"))

Делай добро и бросай его в воду...
Re: Существует ли язык с выводом интерфейсов?
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 21.04.08 17:12
Оценка:
Здравствуйте, 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

Т.е. требуемый интерфейс был выведен, но в нужном месте не обнаружен.
Re[10]: Существует ли язык с выводом интерфейсов?
От: dotneter  
Дата: 22.04.08 06:39
Оценка: +1
Здравствуйте, ., Вы писали:

.>Потому что элементарно переписывается с обычными интерфейсами, без "лишних букв".

Переписывается то оно переписывается, но у вас


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();
}

выделенное и есть лишние буквы.
Talk is cheap. Show me the code.
Re[3]: Существует ли язык с выводом интерфейсов?
От: dotneter  
Дата: 22.04.08 06:42
Оценка:
Здравствуйте, Mckey, Вы писали:

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


Да, вот это похоже на анонимные интерфейс, только вот если методов штуки три это уже получится какой то монстр а не объявление метода. Вывести он эту информацию не может?
Talk is cheap. Show me the code.
Re[2]: Существует ли язык с выводом интерфейсов?
От: dotneter  
Дата: 22.04.08 06:47
Оценка:
Здравствуйте, D. Mon, Вы писали:

Да, вроде тот самый тру вей который я искал, спасибо.
А это # полный эквивалент точки, тоесть такой вывод работает всегда?
Talk is cheap. Show me the code.
Re[4]: Существует ли язык с выводом интерфейсов?
От: Mckey Россия  
Дата: 22.04.08 07:24
Оценка:
Здравствуйте, dotneter, Вы писали:

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


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


D>Да, вот это похоже на анонимные интерфейс, только вот если методов штуки три это уже получится какой то монстр а не объявление метода. Вывести он эту информацию не может?



Тогда либо делайте интерфейсы именнованными, либо умеряйте свои желания..
Делай добро и бросай его в воду...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.