Кастинг и интерфейсное наследование

Каждый объект имеет интерфейс, IItem. А также это, существует интерфейс, известный как IDrawableItem который наследовался Объекту.

Код ниже, пытается потянуть drawable объект, но не может как набор этот класс, который хранилища принимают только IItem. Можно добавить что-либо, что наследовалось IItem к этому классу, но использованию других методов может только быть достигнут путем кастинга.

foreach (var item in Items) {
    item.Draw();               // The casting would go here.
}

Я знаю, как бросить, as и т.д...., но действительно ли это приемлемо? Действительно ли это - лучшая практика?

Просто удивление, если существуют другие способы обработать такие сценарии.

5
задан Martijn Pieters 9 June 2014 в 16:41
поделиться

2 ответа

Фраза - это подстановочный знак и подразумевает, что класс Binarysearchtree может принимать:
a. Тип параметра (T), который расширяется сопоставимым
б. , а также может взять подтип (ы), родитель которого расширяется сопоставимым

конструкции расширяет утилиту класса BinarySearchtree Тип (ы), которые реализуются сопоставимы и его подтипов.

Ниже, фрагмент кода демонстрирует это:

// Below declaration of Helper class doesn't uses the wildcard super
class Helper<T extends Comparable<T>> {
     // some helper methods
}

abstract class Animal implements Comparable<Animal> {
    public int compareTo(final Animal o) {
       // implementation ...           
    }
    // other abstract methods
}

class Mammal extends Animal {
    // implement abstract methods
}

При вышеуказанной декларации заявление Helper X = новый помощник () работает нормально.
Но утверждение: Helper <1137512] Helper X = новый помощник <млекопитающее> () дает ошибку компиляции
Тип параметра Mammal не находится в пределах его связанного
(версия компилятора javac 1.5.0_06 )

Когда декларация хелпера класса изменяется на форму ниже:

class Helper<T extends Comparable<? super T>> {
     // some helper methods
}

Тогда утверждение Helper <1137520] X = новый помощник <млекопитающее> () не дает никакой ошибки компилятора.

При этом использование подстановочного знака максимизирует полезность класса.

-121--4132689-

Использование Перечисление. Oftype для извлечения только те элементы элементов , которые реализуют IdrawableItem :

foreach(var item in Items.OfType<IDrawableItem>()) {
    item.Draw();
}

для решения вопроса Этот нанук спросил в комментариях, приведенный выше код, вероятно, будет переведен в код, эквивалентный следующему:

foreach(var item in Items) {
     if(item is IDrawableItem) {
        ((IDrawable)item).Draw();
     }
}

, конечно, на самом деле есть итератор за кулисами, которые выглядят что-то подобное:

public static IEnumerable<T> OfType<T>(this IEnumerable<TSource> source) {
    if(source == null) {
        throw new ArgumentNullException("source");
    }
    foreach(TSource item in source) {
        if(item is T) {
            yield return (T)item;
        }
    }
}

так, что это Мы, вероятно, повторяем только через элементы один раз. Конечно, нет необходимости, чтобы oftype реализован как выше, но это разумная вещь.

11
ответ дан 13 December 2019 в 05:35
поделиться

Аналогичная проблема уже обсуждалась: Как распознать прямоугольники на этом изображении?

Что касается ваших данных, то прямоугольники, которые вы пытаетесь найти, являются единственными черными объектами. Так что вы можете попытаться сделать пороговую бинаризацию: черные пикселы те, которые имеют ВСЕ три значения RGB меньше 40 (я нашел это эмпирически). Эта простая операция делает ваш картинный выглядит следующим образом:

binarized picture

После этого вы можете применить преобразование Хафа для поиска строк (обсуждается в теме, на которую я ссылался), или вы можете сделать это проще. Вычислите интегральные проекции черных пикселей на оси X и Y. (Проекция на X является вектором x_i - числа черных пикселей, так что она имеет первую координату, равную x_i). Итак, вы получаете возможные значения x и y как пики проекций. Затем просмотрите все возможные сегменты, ограниченные найденными x и y (если существует много черных пикселей между (x_i, y_j) и (x_i, y_k), вероятно, есть линия). Наконец, составьте сегменты линий в прямоугольники!

-121--2636597-

Как и в случае с другими платформами для разработки мобильных приложений, эти поля обычно слишком новые для программ уровня. Вы найдете другие образовательные возможности там, есть классы, книги, скринкасты в iPhone, PalmOS, Android, Blackberry и т.д. разработки просто Google подальше.

Есть вещи, как аспирантура Tisch Interactive Telecommunications Program в Нью-Йорке. Производимая там работа часто имеет мобильный спин к ней .

Вот учебный план для Mobile Me (dia) , например, хотя я не уверен, является ли этот класс конкретно ITP.

В Калифорнии вы можете обратиться в Центр исследований в области вычислительной техники и искусства , который, я думаю, преследует несколько схожие цели.

Чтобы найти другие школы, обучающиеся на курсах по разработке Android, вы можете попробовать поиск, например: «android development» site: .edu . Довольно много людей с классами по крайней мере: Калифорнийский университет, Карнеги-Меллон, Колумбия, Темпл-университет и многие другие.

Обновление

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

-121--1882304-

Два альтернативных решения:

  • Храните компоненты в отдельной коллекции.
  • Добавьте метод DrawIfPossible () в IItem . IDrawableItem должен переопределять его для вызова Draw () , другие реализаторы IItem () должны иметь пустую реализацию.

Явный запрос типа считается признаком того, что с конструкцией может быть что-то не так.

1
ответ дан 13 December 2019 в 05:35
поделиться
Другие вопросы по тегам:

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