Это потому, что Shape
не обладает этими свойствами. Сначала вам нужно привести к определенному типу или сделать shapeFactory
универсальным.
void main() {
var s=shapeFactory('square') as Square;
print(s.area);
print(s.side);
var c= shapeFactory('circle') as Circle;
print(c.area);
print(c.radius);
}
или
T shapeFactory<T extends Shape>(String type){
if(type=='circle') return Circle(2) as T;
if(type=='square') return Square(2) as T;
throw 'Can\'t create $type.';
}
void main() {
var s=shapeFactory<Square>('square');
print(s.area);
print(s.side);
var c= shapeFactory<Circle>('circle');
print(c.area);
print(c.radius);
}
Я пытаюсь думать о базе данных как о месте, чтобы сохранить материал только и поместить весь код абстракции в другом месте. Выражения базы данных уже достаточно сложны, не добавляя функции к ним.
Кроме того, оптимизатор запросов споткнется за любые выражения с функциями, если необходимо когда-либо заканчивать тем, что желали сделать что-то как "ВЫБОР.... ГДЕ MD5 (xxx) =..."
И функции базы данных не являются очень портативными в целом.
Лично, я пытаюсь сохранить базу данных как простую (к минимуму) со Вставкой, Обновлением, Удалить, не имея слишком большой функции, которая может использоваться в коде. Сохраненный Proc является тем же, содержите только задачу, которые являются очень близко к данным персистентности и не связанной бизнес-логике.
Я поместил бы MD5 снаружи. Это позволит встреченный, имеют это "манипулирование данными" вне объема устройства хранения данных базы данных.
Но, Ваш пример довольно "легок", и я не думаю, что это плохо, чтобы иметь его внутри...
Я пытаюсь использовать функции в своем языке сценариев каждый раз, когда вычисления как этот требуются. Я сохраняю свою функцию SQL useage вниз к минимуму по ряду причин.
Основная причина - то, что моя одна база данных SQL ответственна за хостинг нескольких веб-сайтов. Если бы SQL-сервер должен был увязнуть с запросами от одного сайта, то он оказал бы негативное влияние на остальных. Это еще более важно, чтобы рассмотреть, работаете ли Вы над общим сервером, например, хотя в этом случае Вы имеете мало контроля над тем, что делают другие пользователи.
Вторичная причина состоит в том, что мне нравится, когда мой код SQL является максимально портативным. Я даже не хочу пытаться считать различные разновидности SQL, которые существуют, таким образом, я пытаюсь сохранить функции (особенно нестандартные расширения) из моего кода SQL, за исключением вещей как СУММА или МИН/максимум.
Я предполагаю то, что я говорю, SQL разработан, чтобы сохранить и получить данные, и это должно быть сведено к той цели. Используйте свой язык обслуживания выбора выполнить любые вычисления заранее и сохранить Ваш код SQL портативным.
Я думаю большую часть времени, Вы собираетесь хотеть оставить манипулирование данными веб-серверу, но, если Вы хотите обработать базы данных относительно таблиц, отношения, и т.д., затем идут для DB.
Я лично лоббирую свою компанию для обновления нашего сервера MySQL до 5,0 так, чтобы я мог начать использовать в своих интересах процедуры (который уничтожает несколько сайтов, которые мы администрируем).
Используйте свою базу данных в качестве средств сохранения и поддержания целостности данных. И бизнес-логика отпуска за пределами него.
При помещении бизнес-логики, какой-либо из нее, в базе данных, Вы делаете ее более сложной, чтобы управлять и поддержать в будущем.
Как другие ответы до сих пор, я предпочитаю сохранять всю бизнес-логику в одном месте. А именно, мой язык приложения. (Строго говоря, в объектной модели, если Вы присутствуете, но не весь код, OO.)
Однако при оглядывании StackOverflow для (моих) sql-теговых вопросов о том, использовать ли встроенный SQL или хранимые процедуры, Вы найдете, что большинство людей, отвечающих им, сильно выступает за сохраненный procs использования каждый раз, когда и везде, где возможно, даже для большинства тривиальных запросов. Можно хотеть проверить некоторые из тех вопросов видеть некоторые аргументы, способствующие другому подходу.