Каждый объект имеет интерфейс, IItem
. А также это, существует интерфейс, известный как IDrawableItem
который наследовался Объекту.
Код ниже, пытается потянуть drawable объект, но не может как набор этот класс, который хранилища принимают только IItem
. Можно добавить что-либо, что наследовалось IItem
к этому классу, но использованию других методов может только быть достигнут путем кастинга.
foreach (var item in Items) {
item.Draw(); // The casting would go here.
}
Я знаю, как бросить, as
и т.д...., но действительно ли это приемлемо? Действительно ли это - лучшая практика?
Просто удивление, если существуют другие способы обработать такие сценарии.
Фраза Super T>
- это подстановочный знак и подразумевает, что класс Binarysearchtree может принимать:
a. Тип параметра (T), который расширяется сопоставимым
б. , а также может взять подтип (ы), родитель которого расширяется сопоставимым
конструкции Super 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
работает нормально.
Но утверждение: Helper <1137512] Helper
дает ошибку компиляции
Тип параметра Mammal не находится в пределах его связанного
(версия компилятора javac 1.5.0_06 )
Когда декларация хелпера класса изменяется на форму ниже:
class Helper<T extends Comparable<? super T>> {
// some helper methods
}
Тогда утверждение Helper <1137520]
не дает никакой ошибки компилятора.
При этом использование подстановочного знака максимизирует полезность класса.
-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
реализован как выше, но это разумная вещь.
Аналогичная проблема уже обсуждалась: Как распознать прямоугольники на этом изображении?
Что касается ваших данных, то прямоугольники, которые вы пытаетесь найти, являются единственными черными объектами. Так что вы можете попытаться сделать пороговую бинаризацию: черные пикселы те, которые имеют ВСЕ три значения RGB меньше 40 (я нашел это эмпирически). Эта простая операция делает ваш картинный выглядит следующим образом:
После этого вы можете применить преобразование Хафа для поиска строк (обсуждается в теме, на которую я ссылался), или вы можете сделать это проще. Вычислите интегральные проекции черных пикселей на оси 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 ()
должны иметь пустую реализацию. Явный запрос типа считается признаком того, что с конструкцией может быть что-то не так.