coffeeScript中類的多態[學習篇]

類的一大應用就是多態。多態是一個面向對象編程的高級術語----「一個東西可編程不少不一樣的東西,但不是任何東西」。[引自coffeescript深刻淺出]javascript

class Shape
    constructor: (@width) ->
    computeArea: -> throw new Error 'I am an abstract class!'

class Square extends Shape
    computeArea: -> Math.pow @width, 2

class Circle extends Shape
    radius: -> @width / 2
    computeArea: -> Math.PI * Math.pow @radius, 2

showArea = (shape) ->
    unless shape instanceof Shape
        throw new Error 'showArea requires a Shape instance!'
    console.log shape.computeArea()

showArea new Square(2) #4
showArea new Circle(2) #pi

生成的javascriptjava

 

// Generated by CoffeeScript 1.10.0
var Circle, Shape, Square, showArea,
  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
  hasProp = {}.hasOwnProperty;

Shape = (function() {
  function Shape(width) {
    this.width = width;
  }

  Shape.prototype.computeArea = function() {
    throw new Error('I am an abstract class!');
  };

  return Shape;

})();

Square = (function(superClass) {
  extend(Square, superClass);

  function Square() {
    return Square.__super__.constructor.apply(this, arguments);
  }

  Square.prototype.computeArea = function() {
    return Math.pow(this.width, 2);
  };

  return Square;

})(Shape);

Circle = (function(superClass) {
  extend(Circle, superClass);

  function Circle() {
    return Circle.__super__.constructor.apply(this, arguments);
  }

  Circle.prototype.radius = function() {
    return this.width / 2;
  };

  Circle.prototype.computeArea = function() {
    return Math.PI * Math.pow(this.radius, 2);
  };

  return Circle;

})(Shape);

showArea = function(shape) {
  if (!(shape instanceof Shape)) {
    throw new Error('showArea requires a Shape instance!');
  }
  return console.log(shape.computeArea());
};

showArea(new Square(2));

showArea(new Circle(2));
相關文章
相關標籤/搜索