juan_gandhi: (Default)
Juan-Carlos Gandhi ([personal profile] juan_gandhi) wrote2005-02-24 06:39 pm

concrete class in an interface

package com.weird.java;

public interface Untitled1 {
  class XX {
    private String _name;
    public XX(String name) {
      _name = name;
    }
    public String getName() {
      return _name;
    }
  }
}

[identity profile] 109.livejournal.com 2005-02-25 05:01 am (UTC)(link)
not sure what do you mean by "unverse", but my standard trick these days is
public class A {
  private A(){} // to prevent unauthorized instantiation
  public class Factory: BaseFactory {
    public A GetInstance(){...}
  }
}

All because those lazy bastards couldn't spend an extra week to implement static virtual functions.

[identity profile] ivan-gandhi.livejournal.com 2005-02-25 07:47 am (UTC)(link)
Да, в принципе, этого хватает - у Блока в Коллекциях такие трюки сплошь и рядом. Нет, мне просто хочется понять, нельзя ли со смыслом начать употреблять

Untitled.XX somebody = untitled.new XX("Io mi chiamo nessuno");

где untitled is an instance of a class implementing Untitled, the one that I wanted to call a universe.

[identity profile] 109.livejournal.com 2005-02-25 04:57 pm (UTC)(link)
я так и не понял, в чём идея. хранить имплементацию чего бы то ни было в интерфейсе - это портить концепцию, по-моему.

[identity profile] ivan-gandhi.livejournal.com 2005-02-25 07:17 pm (UTC)(link)
:) А как ты в интерфейсе специфицируешь Set? (ответ: а никак...)

[identity profile] 109.livejournal.com 2005-02-26 04:55 am (UTC)(link)
в каком смысле set? в смысле геттера-сеттера? тогда всё уже придумано. в сишарпе есть properties в интерфейсах, а в дельфи уж и совсем давно они есть. property - это и есть пара геттер-сеттер. ну или просто геттер, если read-only.

[identity profile] ivan-gandhi.livejournal.com 2005-02-26 05:30 am (UTC)(link)
Нет; в джаве есть interface Set; e.g. class HashSet implements Set; comments to the source code "stipulate" that all set elements are different (w.r.t. equals()).

[identity profile] 109.livejournal.com 2005-02-26 05:19 pm (UTC)(link)
что-то я тогда совсем ничего не понимаю. какой смысл ты вкладывал во фразу как ты в интерфейсе специфицируешь Set?

[identity profile] ivan-gandhi.livejournal.com 2005-02-28 04:20 am (UTC)(link)
Каким образом ты определишь с помощью интерфейса такое понятие, как Set, с конкретными классами типа HashSet, LinkedHashSet, and what not?

[identity profile] 109.livejournal.com 2005-02-28 04:38 am (UTC)(link)
интерфейс - это набор сигнатур. ПОНЯТИЕ - это, очевидно, что-то другое. сначала нужно формализовать, что такое ПОНЯТИЕ (например вот понятие Set), а потом думать, какими языковыми средствами это выразить. см. другой тред.

[identity profile] 109.livejournal.com 2005-02-25 05:03 pm (UTC)(link)
а тебе принципиально то, что ты написал, или

Untitled.XX bla = new untitled.XX("bla-bla");

тоже пойдёт?

[identity profile] ivan-gandhi.livejournal.com 2005-02-25 07:18 pm (UTC)(link)
Не совсем. Идея была такая, чтобы иметь контекстный new, который бы одновременно изображал из себя фабрику, выглядел бы красиво, и не требовал бы добавления специального метода.

[identity profile] 109.livejournal.com 2005-02-26 04:52 am (UTC)(link)
а что такое контекстный new и чем он отличается от обычного?

[identity profile] ivan-gandhi.livejournal.com 2005-02-26 05:32 am (UTC)(link)
"Обычный" - статический метод для инстанциируемого класса. Но если класс внутренний, то метод уже не статический, а связан с экземпляром объемлющего класса. Ну и вот. Я думал на такой телеге объехать фабрику.

[identity profile] 109.livejournal.com 2005-02-26 05:15 pm (UTC)(link)
не статический, а связан с экземпляром объемлющего класса

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

в сишарпе всё по-человечески: new Outer.Inner();
нужна ссылка на инстанс Outer - заводи члена, не нужна - не заводи.

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

[identity profile] ivan-gandhi.livejournal.com 2005-02-27 04:12 am (UTC)(link)
Я это не считаю извращением. Просто надо смотреть на это по-другому. Смотри, new без контекста - это статический метод. А внутри - он как бы локальный метод. Кроме того, появление возможности дать внутренним классам доступ в локальную вселенную, так сказать, делает язык вообще более объёмным.

Ну и со ссылкой-то понятно; но не хотелось бы рассуждать на уровне пойнтеров, всё-таки 21-й век.

Я не думаю, что причина внутренних классов - отсутствие "указателей на функции" (блин, опять указатели). Скорее я бы сказал, что с функциями в джаве нельзя обращаться как с отдельными сущностями. А где можно?

Ну вот скажи, как бы ты в сишарпе определил класс Set, так чтобы equals() вычислялся правильно, и при этом бы Set оставался интерфейсом (т.е. допускал бы множественное наследование.:)?

А как это сделать в смолтоке?

Я сейчас балуюсь с чем-то таким:

interface Object {
Object template = new Object() {
..........
}
}

хорошо бы понять, до чего хорошего тут можно дойти.

[identity profile] 109.livejournal.com 2005-02-27 05:24 am (UTC)(link)
Скорее я бы сказал, что с функциями в джаве нельзя обращаться как с отдельными сущностями. А где можно?

везде можно. в С++, в Дельфи, в C#. потому что нужно. а джава родилась в мучительном разрыве между попыткой сделать правильно и желанием побыстрее выбросить продукт на рынок. как, впрочем, всё у Сана. если бы не упомянутое желание, в джаве generics бы с самого начала были. а так сколько лет прошло, и сколько кумаров успело набежать?

Ну вот скажи, как бы ты в сишарпе определил класс Set, так чтобы equals() вычислялся правильно, и при этом бы Set оставался интерфейсом (т.е. допускал бы множественное наследование)?

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

[identity profile] ivan-gandhi.livejournal.com 2005-02-28 04:30 am (UTC)(link)
Видишь ли. В принципе, конечно, да - определяй в интерфейсе лицо, а имплементацию оставь имплементации.

Но имплементация имплементации рознь. Определение equals() относится не к имплементации, а к определению типа. Точно также для списков операция равенства определяется как равенство головы и хвоста. Во всём этом достаточно полиморфизма; просто один только интерфейс задаёт сигнатуры операций, но не задаёт аксиомы. Условия, то есть. Как задавать условия? В принципе, интерфейсы для этого достаточно гибки: в них можно задавать константы. Вот в константах-то я и пытаюсь держать аксиомы. Неправильно - но где такой язык, в котором я мог бы писать правильно? Сишарп? Камл? Хаскел? Я не знаю; скажите мне.

[identity profile] 109.livejournal.com 2005-02-28 04:42 am (UTC)(link)
ну да, но не аксиомы только, а инварианты. "все Set-ы должны удовлетворять..." формализуй, чему должны удовлетворять все сеты - и (может быть) станет ясно, как это положить на язык.