2010-10-20 5 views
1

Я разработки в C++, и иногда я хотел бы сказать что-то вроде этого:язык программирования, который поддерживает наследование типов значений

class Heading : public float // this line won't compile 
{ 
public: 
    Heading(float const value_) 
    : float(value_)    // this line won't compile 
    { 
    assert(value_ >= 0.0f); 
    assert(value_ <= 360.0f); 
    } 
}; 

Вместо этого я должен сделать что-то вроде:

class Heading : public float 
{ 
public: 
    Heading(float const value_) 
    : value(value_) 
    { 
    assert(value >= 0.0f); 
    assert(value <= 360.0f); 
    } 
private: 
    float value; 
}; 

ли существуют ли какие-либо языки программирования, позволяющие расширять типы значений?

ответ

3

Python.

Все - объект. Таким образом, расширение float прост.

class Heading(float): 
    def __init__(self, value): 
     assert 0.0 <= value <= 360.0 
     super(Heading, self).__init__(value) 

И да, 0.0 <= value <= 360.0 - это юридический синтаксис.

+1

360? Ты язычник. Должно быть '2 * math.pi'! :-P –

+1

@Chris: Больше похоже на - * π * и * π * :-) – Joey

+1

Um ... OP был в градусах. И, будучи матросом, я использую степени больше, чем радианы. –

0

D, java и Objective-C позволяют получать встроенные типы. На самом деле большинство объектно-ориентированных языков со встроенными типами, определенными для наследования от Object позволяют наследовать от встроенных типов. (Я уверен, что есть контрпример, и мы собираемся узнать об этом в комментариях ...)

+0

IMO, самый интригующий ответ из вашего списка языков - D, поскольку он соответствует уровню C++ с точки зрения производительности (если не лучше?) И выигрывает с точки зрения синтаксиса. – sivabudh

+3

Типы значений - это не то же самое, что встроенные типы. Вы не можете наследовать от 'float' в Java - на самом деле вы не можете наследовать от эквивалентного ссылочного типа' Float', хотя это проблема библиотеки, а не проблема языка. Объектив-C имеет такое же ограничение. Я не знаю о D. – Porculus

+0

C# - встречный пример: все ValueTypes (включая встроенный int, bool и т. Д.) Наследуют от Object, но «запечатаны». –

1

Ada это позволяет в ограниченной степени: в частности, ваш пример может быть выражен в Аде, как

type Heading is digits 10 
    range 0.0..360.0; 

У Паскаля была аналогичная функция, которая была, IIRC, ограничена целыми числами.

Я не знаю ни одного языка, который позволяет неограниченно Наследование от примитивных типов, таких как float. Объектно-ориентированное наследование по определению включает в себя наследование от класса, который по определению не похож на C++ float.

+0

Это * поддиапазон, печатающий *. Это * подтипирование *, но не действительно * наследование * (по крайней мере, не в смысле слова ОО). BTW: Я действительно не понимаю, почему так мало языков (в основном только Pascal и его производных) имеют поддиапазон. Это очень полезно, легко использовать, легко понять и легко реализовать. –

3

В рубине вы можете пойти дальше. Вы можете на самом деле изменить встроенных типов.

class Float 
    class self.heading(val) 
    raise RangeError unless (0.0...360.0) === val 
    val 
    end 
end 
+0

Святое дерьмо, которое испортило мне разум. ;-) – sivabudh

Смежные вопросы