Сегодня я столкнулся с вопросом , найденным здесь , который вызвал у меня этот вопрос.
Вот псевдокодовый пример того, что я получаю:
class Car{
public:
virtual int goFast() = 0;
};
class FordFocus : public Car {
public:
int goFast(){
return 35;
};
};
class Lamborghini : public Car {
bool roof;
public:
int goFast(){
return -1/0; // crash
};
void retractTheRoof(){
roof = 0;
};
};
class RichGuy {
vector cars;
public:
void goDrive() {
for(int i = 0; i < cars.size(); ++i) {
if(Lamborghini* lambo = dynamic_cast(cars[i])) {
lambo->retractTheRoof();
};
goFast();
};
};
};
В примере есть класс RichGuy
. Рихги
держит трек о своих автомобилях
только в одном векторе. Потому что у него так много автомобилей
было бы слишком хлопотно держать трек из них на основе, если они FordFocus
или Lamborghini
. Однако единственный тип автомобиля у него с выдвижной крышей - Lambo. Для того, чтобы retractTheRoof ()
, RichGuy
теперь должен определить, действительно ли Car
, который он имеет, является Lamboghini
, и затем выполнить эту функцию.
Исходя из этого примера, был ли выбор понизить в хорошем дизайне? Или это нарушило цель полиморфизма, предполагая, что цель состоит в том, чтобы позволить производным классам определить свое собственное поведение, и предоставить общий интерфейс для таких классов, как RichGuy
? И если да, то есть ли лучший способ, чтобы функции, такие как retractTheRoof ()
(или, по крайней мере, это эффект), были доступны RichGuy
для использования?
-121--779570-
Я новичок в CoffeyScript, и, похоже, у меня возникли проблемы с синтаксисом вызова методов.
Вот модель карты:
class exports.Card extends Backbone.Model
defaults:
pip: '4'
suit: '♠'
color: 'b'
rows: ->
rows =
'4': [2, 0, 2]
rows[@pip]
И соответствующая часть шаблона:
, которая дает мне ошибку Неподтвержденный TypeError: Object # не имеет метода «rows»
В частности, мне интересно, если я использую неправильный синтаксис для метода строк карты или я просто что-то не понимаю. Заранее спасибо!
Обновление:
По какой-то причине @ card.property
всегда работает нормально, но @ card.any _ method ()
никогда не работает. Я обошел это в данный момент, используя свойства, но я был бы рад, если бы кто-то смог объяснить это поведение. Еще раз спасибо!
Обновить 2:
Я использую http://brunchwithcoffee.com , если это помощь кому-либо, и вот файл main.coffee
, чтобы показать, как создается экземпляр @ card
и передается в представление.
window.app = {}
app.routers = {}
app.models = {}
app.collections = {}
app.views = {}
Card = require('models/card_model').Card
MainRouter = require('routers/main_router').MainRouter
HomeView = require('views/home_view').HomeView
CardView = require('views/card_view').CardView
# app bootstrapping on document ready
$(document).ready ->
app.initialize = ->
app.routers.main = new MainRouter()
app.views.home = new HomeView()
app.views.card = new CardView(model: new Card(color: 'r', suit: '♥', pip: '7'))
app.routers.main.navigate 'home', true if Backbone.history.getFragment() is ''
app.initialize()
Backbone.history.start()