Прежде всего, я почти ничего не знаю о теории языка, и я почти не знаю каких-либо других языков, кроме Java, но у меня была идея, что я думаю, что это круто, но мне нужно, чтобы вы сказали мне:
a: why это отстой
б: как язык х были, что в течение многих лет
с: как мой ум сосет
D: все вышеперечисленноеМожет ли синтаксис композиции быть полезным дополнением к Java?
идея дала бы сОСТАВУ ту же легкость повторного использования кода, что делает extends
.
Так что, если у вас есть класс вроде этого:
public interface A { public void methodInA(); }
И тогда вы имели класс вроде этого:
public class B { private composed A; public B() { // construct A within constructor } }
Вы бы тогда быть в состоянии сделать это:
B myB = new B(); myB.methodInA();
Без необходимости добавлять делегацию в класс B. Но вы также можете сделать то же самое, как с наследованием, то есть:
@Overrides public void methodInA(){ // B's own delegation method }
К недостаткам можно отнести:
- методы скрыты в исходном коде, что делает его менее очевидным, когда вызов приходит, но это также в случае с
extends
- если составленные поля одни и те же сигнатуру метода там должен быть конфликт решен (как противоречащие друг другу интерфейсы решить эту проблему?)
- , если вы хотите иметь несколько составленных полей одного и того же типа, было бы очевидно, что конфликт, для которого поле делегировать
- вероятно 100 другие вещи, которые я не думал о
Как я уже сказал, я не буду, очевидно, ни один язык теоретиком, и я не имею потраченные возрасты думали об этом, идея только что появилась у меня в голове, и я хотел знать, насколько я ошибаюсь. Я просто думаю, что это было бы круто.
«Честно говоря, если вы действительно знали, что делаете ...» - и в этом и заключается мой друг! :-D – Grundlefleck
Подход, который я бы одобрил, должен был позволить классу обозначать два члена (например, «первый» и «второй»), так что попытка доступа к 'foo.someMemberName', когда' foo' не имеет такого члена, переписывать как 'foo.first(). someMemberName' [без использования такого поиска рекурсивно при возврате из' first'], и если это не удалось, 'foo.first(). someMemberName' [позволяющий рекурсивный поиск по возврату из' second']. Обратите внимание, что не требуется «укладка» рекурсивного поиска. – supercat