2016 пересдача ответы вариант 1 (Решённые задачи прошлых лет), страница 2
Описание файла
Файл "2016 пересдача ответы вариант 1" внутри архива находится в папке "Решённые задачи прошлых лет". PDF-файл из архива "Решённые задачи прошлых лет", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 2 страницы из PDF
Неслучайно анонимные делегаты(то есть типизированные лямбды) появились в языке ужесо второй версии, а вскоре поспели и настоящие лямда-выражения. Поэтому в C#программа должна выглядеть более естественно, чем в Java. И не надо «тупо»транслировать то, что не транслируется (например, функциональные интерфейсы).Вместо функционального интерфейса просто описываем делегатский типdelegate int Compute(int i);Объекты-делегаты — уже callables – то есть их можно вызывать (точнее применять к нимоперацию вызова «()») напрямую без всяких методов-посредников типа compute(i).Окончательно получаемpublic class Generator{public delegate int Compute(int i);static void Main(String[] args) {generate(x=>x*x, 10);generate(x=>x*x*x, 10);}static void generate(Compute func, int n) {for (int i = 1; i <= n; ++i) {System.Console.Write(func(i)); // обратите внимание на отсутствие вызоваfunc.compute(i) - он больше не нуженSystem.Console.Write(' ');}}}И все!Задача 1-6Объявление шаблонного класса CalcSort на языке С++ предполагает, что над параметром шаблона Tвыполняются 4 арифметические операции (+,-,*,/) и операции сравнения:template <typename T> class CalcSort { … };Напишите эквивалентное объявление обобщенного класса CalcSort на языке Java (опустив, как и выше,все объявления членов класса), добавив при необходимости нужные объявления типов вне этого класса.ОтветСм.
ответ и замечания по поводу задачи 2-6 из второго варианта, только в Javaограничения могут быть ТОЛЬКО в форме наследования класса или интерфейса (ещепроще)interface Arithmetic<T> {T Add(T x);T Mult(T x);T Sub(T x);T Div(T x);}class CalcSort<T extends Comparable<T>, Arithmetic<T> { … }Задача 1-7Дайте определение и пример локального анонимного класса в языке Java. Есть ли аналогичное понятие вязыках С++ или С#?ОтветКоротко: детали ответа можно найти в книге Гослинга, Арнольда и Холмса «Языкпрограммирования Java» 3-е издание, п.5.4.
Анонимные внутренние классы, стр.148.В С# и C++ такого понятия нет.Замечание. Постоянная (и грубая) ошибка: путать внутренние и вложенные классы.Это - «две большие разницы». Подробно и обстоятельно написано там же в 5 главе«Вложенные классы и интерфейсы».Задача 1-8Пусть программа на языке C# содержит следующий ошибочный фрагмент:class D { }interface IFace <T, R>{R Generate();void Process(T x);}IFace<D, Object> f1 = new ObjectFace(); //error!IFace<D, Object> f2 = new DFace(); //error!class ObjectFace : IFace<Object, Object> {public Object Generate() { return new Object();}public void Process(Object x) {}}class DFace : IFace<D, D> {public D Generate() { return new D(); }public void Process(D x) { }}Объясните, в чем состоит ошибка, и исправьте РОВНО ОДНУ строчку во фрагменте так, чтобы ошибкаисчезла.ОтветОшибка состоит в том, что по правилам языка конкретизации обобщенных интерфейсов(без указания вариантности по параматрам) инвариантны, если их фактические типыпараметры различны (независимо от вариантности типов-параметров).
Поэтому IFace<D,Object> не приводится ни к IFace<Object, Object>, ни к IFace<D, D> (это и естьинвариантность).В Java, кстати, такая же история. Но решается проблема в C# и Java по-разному. В C#вариантность интерфейса указывается при определении самого интерфейса по каждомутипу — ковариантность указывается как out, а контравариантность — как in, чтохорошо согласуется с тем, как типы-параметры используются в методах обобщенногоинтерфейса.Интерфейс IFace ковариантен по типу R, и контравариантен по типу T.
Поэтому вместоinterface IFace <T, R>надо поставитьinterface IFace <in T, out R>.