Доступ к закрытой переменной класса super () в Java - JChart2D

Я расширил класс в Java, который имеет закрытую переменную, значение которой я хочу получить до того, как она будет изменена. В суперклассе нет методов для доступа к этой переменной. Я попытался super (). M_zoomArea (переменная находится в классе ZoomableChart jChart2D). Переменная обновляется при вызове метода mouseDragged . Я переопределил этот метод и хотел бы получить значение переменной до ее обновления. {IEnumerator GetEnumerator (); } В этом интерфейсе универсальный тип используется только как ...

Например, интерфейс IEnumerable :

public interface IEnumerable<out T> : IEnumerable
{
    IEnumerator<T> GetEnumerator();
}

В этом интерфейсе универсальный тип используется только в качестве возвращаемого типа интерфейса. Метод и не используется в качестве типа аргументов метода, поэтому он может быть ковариантным. Учитывая это, компилятор не может теоретически вывести отклонение от интерфейса? Если это возможно, почему C # требует, чтобы мы явно устанавливали ключевые слова co / contravariance.

Обновление : Как упоминал Джон Скит, этот вопрос можно разбить на подвопросы:

  1. Может ли компилятор вывести co / contravariance универсального типа по тому, как он используется внутри текущего универсального типа и всех его базовых типов ?

    Например. Сколько общих параметров интерфейса из .NET Framework 4.0 может быть помечено автоматически как совместное / противоречивое без какой-либо двусмысленности? Около 70%, 80%, 90% или 100%?

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

16
задан Konstantin Tarkus 30 August 2010 в 22:31
поделиться

1 ответ

Ну, тут два вопроса. Во-первых, может компилятор всегда так делать? Во-вторых, должен он (если может)?

По первому вопросу я полагаюсь на Эрика Липперта, который сделал этот комментарий, когда я поднял именно этот вопрос во 2-м издании C# in Depth:

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

(Надеюсь, Эрик не возражает, если я процитирую это дословно; раньше он очень хорошо делился такими мыслями, поэтому я использую прошлую форму :)

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

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

В принципе, я считаю правильным требовать, чтобы это было явным — это проектное решение, которое вы должны принимать сознательно, а не просто случайно получить ковариантность/контравариантность, не подумав об этом.

16
ответ дан 30 November 2019 в 22:09
поделиться
Другие вопросы по тегам:

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