Побеждает ли понижение курса цель полиморфизма?

Сегодня я столкнулся с вопросом , найденным здесь , который вызвал у меня этот вопрос.

Вот псевдокодовый пример того, что я получаю:

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-

Синтаксис вызова метода в сценарии Я новичок в сценарии, и я Вот модель карты: экспорт классов. Карта расширяет Backbone.Model по умолчанию: pip: '4' костюм: '♠...

Я новичок в 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()

6
задан mportiz08 26 August 2011 в 20:57
поделиться