Я расширил класс в Java, который имеет закрытую переменную, значение которой я хочу получить до того, как она будет изменена. В суперклассе нет методов для доступа к этой переменной. Я попытался Например, интерфейс В этом интерфейсе универсальный тип используется только в качестве возвращаемого типа интерфейса. Метод и не используется в качестве типа аргументов метода, поэтому он может быть ковариантным. Учитывая это, компилятор не может теоретически вывести отклонение от интерфейса? Если это возможно, почему C # требует, чтобы мы явно устанавливали ключевые слова co / contravariance. Обновление : Как упоминал Джон Скит, этот вопрос можно разбить на подвопросы: Может ли компилятор вывести co / contravariance универсального типа по тому, как он используется внутри текущего универсального типа и всех его базовых типов ? Например. Сколько общих параметров интерфейса из .NET Framework 4.0 может быть помечено автоматически как совместное / противоречивое без какой-либо двусмысленности? Около 70%, 80%, 90% или 100%? Если это возможно, следует применить ко / контрвариантность к родовым типам по умолчанию? По крайней мере для тех типов, которые он способен анализировать и выводить со / контрвариантность из использования типа. super (). M_zoomArea
(переменная находится в классе ZoomableChart
jChart2D). Переменная обновляется при вызове метода mouseDragged
. Я переопределил этот метод и хотел бы получить значение переменной до ее обновления.
{IEnumerator IEnumerable
: public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
Ну, тут два вопроса. Во-первых, может компилятор всегда так делать? Во-вторых, должен он (если может)?
По первому вопросу я полагаюсь на Эрика Липперта, который сделал этот комментарий, когда я поднял именно этот вопрос во 2-м издании C# in Depth:
Мне не ясно, что мы разумно могли бы, даже если бы мы хотели. Мы можем легко подойти с ситуациями, требующими дорогостоящего глобального анализа всех интерфейсов в программе для работы с отклонениями, и мы можем легко придумать ситуации, когда либо это
или
и нет возможности выбрать между ними. С обоими плохо производительность и неоднозначные случаи это маловероятная функция.
(Надеюсь, Эрик не возражает, если я процитирую это дословно; раньше он очень хорошо делился такими мыслями, поэтому я использую прошлую форму :)
С другой стороны, я подозреваю, что все еще есть случаи где это может быть выведено без двусмысленности, поэтому второй пункт все еще актуален...
Я не думаю, что это должно быть автоматическим, даже если компилятор может однозначно знать, что он действителен только в одном способ.Хотя расширение интерфейса всегда является в некоторой степени критическим изменением, обычно это не так, если вы единственный, кто его реализует. Однако, если люди полагаются на ваш интерфейс как на вариативный, вы не сможете добавлять в него методы, не нарушая работы клиентов... даже если они просто вызывают, а не реализуют. Добавляемые вами методы могут изменить ранее ковариантный интерфейс, сделав его инвариантным, и в этот момент вы нарушите работу любых вызывающих объектов, которые пытаются использовать его ковариантно.
В принципе, я считаю правильным требовать, чтобы это было явным — это проектное решение, которое вы должны принимать сознательно, а не просто случайно получить ковариантность/контравариантность, не подумав об этом.