Наследование с локальными классами [duplicate]

Вы можете сделать это с помощью функции reshape() или с функциями melt() / cast() в пакете reshape. Для второго варианта пример кода:

library(reshape)
cast(dat1, name ~ numbers)

Или с помощью reshape2

library(reshape2)
dcast(dat1, name ~ numbers)
152
задан Paŭlo Ebermann 9 November 2011 в 02:05
поделиться

9 ответов

Внутренний класс - это просто способ четко отделить некоторые функциональные возможности, которые действительно относятся к исходному внешнему классу. Они предназначены для использования, если у вас есть 2 требования:

  1. Некоторые функции в вашем внешнем классе были бы наиболее ясными, если бы они были реализованы в отдельном классе.
  2. Несмотря на то, что он находится в отдельном классе, функциональность очень тесно связана с тем, что внешний класс работает.

Учитывая эти требования, внутренние классы имеют полный доступ к своему внешнему классу. Поскольку они в основном являются членами внешнего класса, имеет смысл, что они имеют доступ к методам и атрибутам внешнего класса, включая рядовых.

78
ответ дан Kaleb Brasee 23 August 2018 в 00:28
поделиться
  • 1
    Этот ответ объясняет, почему вложенные классы имеют доступ к закрытым членам своего внешнего класса. Но возникает вопрос, почему внешний класс имеет доступ к закрытым членам вложенных классов. – Andrew 29 February 2012 в 20:04
  • 2
    Просто добавьте & quot; и наоборот & quot; to Учитывая эти требования, внутренние классы имеют полный доступ к их внешнему классу , и теперь он отвечает на вопрос. – anthropomo 14 June 2013 в 16:10
  • 3
    Это не правильный ответ на эту проблему, здесь: stackoverflow.com/questions/19747812/… – Colin Su 28 March 2014 в 05:08
  • 4
    @anthropomo: Нет, это не так. Оба требования совершенно осуществимы, если внешний класс не имеет доступа к частным членам внутренних классов. – O. R. Mapper 16 December 2014 в 13:00
  • 5
    Одним из хороших примеров, когда это особенно полезно, является шаблон Builder, stackoverflow.com/a/1953567/1262000 . Родительскому классу просто нужен конструктор, который принимает Builder и получает доступ ко всем его переменным-членам. В противном случае вам нужно будет иметь частный конструктор в родительском классе со всеми частными переменными-членами. – vikky.rk 7 May 2015 в 23:57

Поскольку ваш метод main() находится в классе ABC, который может получить доступ к собственному внутреннему классу.

-2
ответ дан aberrant80 23 August 2018 в 00:28
поделиться
  • 1
    Вопрос заключается не в том, могут ли члены класса ABC получить доступ к классам, вложенным в класс ABC, но почему они могут обращаться к частным членам классов, вложенных в класс ABC в Java. – O. R. Mapper 16 December 2014 в 13:07
  • 2
    Потому что он может! – clwhisk 4 May 2015 в 16:08
  • 3
    Я ответил на вопрос в тот же день, когда его попросили. Кто-то отредактировал вопрос спустя два года, а нижестоящий - 3 года спустя. Я уверен, что кто бы ни редактировал этот вопрос, слишком сильно изменил формулировку вопроса. – aberrant80 12 August 2015 в 09:11

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

Если в вашем случае нет смысла, чтобы классы могли видеть внутреннюю работу друг друга, что в основном означает, что внутренний класс мог бы просто быть обычным классом, вы может объявить внутренний класс как static class XYZ. Использование static будет означать, что они не будут делить состояние (и, например, new ABC().new XYZ() не будет работать, и вам нужно будет использовать new ABC.XYZ(). Но если это так, вам следует подумать о том, следует ли XYZ действительно, является внутренним классом, и, возможно, он заслуживает своего собственного файла. Иногда имеет смысл создавать статический внутренний класс (например, если вам нужен небольшой класс, который реализует интерфейс, используемый вашим внешним классом, и это не будет полезно в любом месте). Но примерно в половине случаев это должно было быть сделано внешним классом.

3
ответ дан abyx 23 August 2018 в 00:28
поделиться
  • 1
    Внешний класс может также обращаться к частным членам статических внутренних классов, поэтому это не имеет ничего общего с static . Вы говорите «нет смысла, чтобы классы могли видеть внутреннюю работу друг друга», но это не обязательно так: что, если имеет смысл только для внутреннего класса видеть внутреннюю работу внешнего класса, но не порок -versa? – O. R. Mapper 16 December 2014 в 13:04

Тило добавил хороший ответ для вашего первого вопроса «Как это возможно?». Я хочу немного рассказать о втором заданном вопросе: почему это поведение разрешено?

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

Итак, почему же? Я думаю, что пример лучше иллюстрирует точку.

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

Итак, мозг является неотъемлемой частью тела - и, как ни странно, наоборот. Использование контроля доступа между такими тесно связанными объектами утрачивает свою претензию на отношения. Если вам нужен контроль доступа, вам нужно отделить классы больше от действительно разных единиц. До тех пор они являются одной и той же единицей. Примером вождения для дальнейших исследований было бы посмотреть, как обычно реализуется Java Iterator .

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

13
ответ дан Community 23 August 2018 в 00:28
поделиться
  • 1
    Хороший комментарий, но ответа нет. – ceving 4 September 2013 в 09:42
  • 2
    @cerving Это на самом деле единственный ответ, который позволил мне увидеть практическое использование этого необычного дизайнерского решения. Вопрос в том, почему это было решено именно так, и это отличная аргументация - демонстрация разницы между тем, что вы хотите, чтобы внешний класс получил доступ во внутреннем классе и к чему вы хотите получить доступ к другим несвязанным классам. – et_l 29 September 2016 в 09:25
  • 3
    Я думаю, что этот фрагмент может хорошо ответить на мой вопрос. – shen 8 April 2017 в 00:04

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

class ABC{
    private interface MyInterface{
         void printInt();
    }

    private static MyInterface mMember = new MyInterface(){
        private int x=10;

        public void printInt(){
            System.out.println(String.valueOf(x));
        }
    };

    public static void main(String... args){
        System.out.println("Hello :: "+mMember.x); ///not allowed
        mMember.printInt(); // allowed
    }
}
51
ответ дан MAC 23 August 2018 в 00:28
поделиться
  • 1
    Это яркий фрагмент кода. Только то, что мне было нужно. Благодаря! – kevinarpe 8 March 2013 в 13:23
  • 2
    Просьба предоставить код, который можно запустить. Более того, причина, по которой приватная переменная не может быть разрешена. – androidyue 2 October 2014 в 04:49
  • 3
    Но тогда ... внутренний класс анонимен. Вы не можете создать несколько экземпляров этого внутреннего класса или использовать этот внутренний класс для любых объявлений переменных и т. Д. – O. R. Mapper 16 December 2014 в 13:02
  • 4
    @ИЛИ. Mapper, поэтому даже если x является общедоступным, это запрещено, например mMember.x. – MAC 22 August 2018 в 18:48

Внутренний класс рассматривается как атрибут класса Outer. Следовательно, независимо от того, какая переменная экземпляра класса Inner является частной или нет, Outer-класс может получить доступ без каких-либо проблем, как доступ к другим его частным атрибутам (переменным).

class Outer{

private int a;

class Inner{
private int b=0;
}

void outMethod(){
a = new Inner().b;
}
}
-1
ответ дан MonMoonkey 23 August 2018 в 00:28
поделиться

Внутренний класс (для целей контроля доступа) считается частью содержащего класса. Это означает полный доступ ко всем частным лицам.

Способ реализации: использовать синтетические методы, защищенные пакетом. Внутренний класс будет скомпилирован в отдельный класс в одном пакете (ABC $ XYZ). JVM не поддерживает этот уровень изоляции напрямую, так что на уровне байт-кода ABC $ XYZ будут иметь защищенные пакетом методы, которые внешний класс использует для доступа к частным методам / полям.

48
ответ дан Thilo 23 August 2018 в 00:28
поделиться

Ограничения доступа выполняются для каждого класса. Невозможно, чтобы метод, объявленный в классе, не мог получить доступ ко всем членам экземпляра / класса. Разумеется, внутренние классы также имеют неограниченный доступ к членам внешнего класса, а внешний класс имеет неограниченный доступ к членам внутреннего класса.

Поместив класс внутри другого класса, вы делают его жестко привязанным к реализации, и все, что является частью реализации, должно иметь доступ к другим частям.

3
ответ дан TofuBeer 23 August 2018 в 00:28
поделиться
14
ответ дан Community 5 November 2018 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: