Показать сообщение отдельно
Старый 11.03.2011, 22:01   #65
Черный крыс
 
Сообщений: n/a
Ответ: Вопрос-Ответ (для новичков BlitzMax)

1) Типы внутри типов использовать МОЖНО., естественно, обьявить новый тип в теле другого типа никто вам не даст. А вот такая запись вполне допустима :

Type TCar
    Field _pos:Float
    Method Update()
        Type TTire
            field _x:Float
            Method Update()
                ...
            EndMethod
        EndType
    EndMethod
EndType
Тип TTire - временный, или по другому статичный.

2) Насчет статичных функций. Всегда считал, что с приходом методов они стали атавизмом. Ну нету таким функциям рационального использования и все тут! Единственное что они привносят - так это путаницу, и нечитабельность кода. Более того они не являются частью ООП. Многие новички любят делать такими функциями конструкторы и деструкторы, но вот только с точки зрения ООП - это все равно, что загнать себя в угол и кричать потом от безисходности и нечитабельности кода. Да и еще, статичные функци начинают "по настоящему" мешать, если речь идет о развитии и поддержке кода, так как они убивают само понятие "наследования" читай ООП.

3) Отсюда вывод -> Никаких функций в типах. Конструкторы и деструкторы можно легко сделать на методах.

Type TVector
    Field x:Float
    Field y:Float
 
    Method New() ' Дефолтный конструктор
        x=0 ; y=0
    EndMethod
 
    Method Create:TVector(x:Float = 0.0, y:Float = 0.0) ' Расширенный конструктор
        Self.x=x ; Self.y=y
        Return Self
    EndMethod
 
    Method Delete() ' Деструктор для GC
        Free()
    EndMethod
 
    Method Free() ' Принудительный деструктор
        x=Null ; y=Null
    EndMethod
EndType
Юзаем так :

 
Local v0:TVector = New TVector ' x=0 ; y=0
Local v1:TVector = New TVector.Create(10.0,15.0) ' x=10.0 ; y=15.0
 
v0 = Null ' Delete()
v1.Free()
v1 = Null
4) Как всем известно если вы в потомке обьявляете одноименный метод предка, то метод потомка заместит метод предка, а метод предка станет доступным через кейворд 'Super'. - В той же мере это относится и к полям, они тоже перекрываются и поля предка доступны через это же слово. Пример :

Type TParent
Field _value:String = "Parent field!"
EndType
 
Type TChild Extends TParent
Field _value:Int = 100
 
Method Test()
DebugLog(Super._value)
DebugLog(String(_value))
EndMethod
EndType
Догадайтесь с трех раз, что выведется на консоль?!

ЗЫ : Хотя, некоторые БМаксеры считают это небезопасным маневром в плане уборки мусора.

ПРАВКА : Насчет полей я был не прав. Их можно только переопределить.

Последний раз редактировалось Черный крыс, 12.03.2011 в 01:00.
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
JeanWinters (12.03.2011)