Freebasic Сборка компилятора версии 0.25
Для тех кому интересно, в ней встроены абстрактные и виртуальные методы.
Скачивание:
fbc0.25_windows.zip
fbc0.25_linux.zip
Вот например несколько примеров от fxm:
Это виртуальный:
Code
Type Hello extends object
Declare virtual Sub hi( )
End Type
Type HelloEnglish extends Hello
Declare Sub hi( )
End Type
Type HelloFrench extends Hello
Declare Sub hi( )
End Type
Type HelloGerman extends Hello
Declare Sub hi( )
End Type
Sub Hello.hi( )
Print "hi!"
End Sub
Sub HelloEnglish.hi( )
Print "hello!"
End Sub
Sub HelloFrench.hi( )
Print "Salut!"
End Sub
Sub HelloGerman.hi( )
Print "Hallo!"
End Sub
Randomize( Timer( ) )
Dim As Hello Ptr h
For i As Integer = 0 To 9
Select Case( Int( Rnd( ) * 4 ) + 1 )
Case 1
h = New HelloEnglish
Case 2
h = New HelloFrench
Case 3
h = New HelloGerman
Case Else
h = New Hello
End Select
h->hi( )
Delete h
Next
Sleep
Это абстрактный:
Code
Type Hello extends object
Declare abstract Sub hi( )
End Type
Type HelloEnglish extends Hello
Declare Sub hi( )
End Type
Type HelloFrench extends Hello
Declare Sub hi( )
End Type
Type HelloGerman extends Hello
Declare Sub hi( )
End Type
Sub HelloEnglish.hi( )
Print "hello!"
End Sub
Sub HelloFrench.hi( )
Print "Salut!"
End Sub
Sub HelloGerman.hi( )
Print "Hallo!"
End Sub
Randomize( Timer( ) )
Dim As Hello Ptr h
For i As Integer = 0 To 9
Select Case( Int( Rnd( ) * 3 ) + 1 )
Case 1
h = New HelloFrench
Case 2
h = New HelloGerman
Case Else
h = New HelloEnglish
End Select
h->hi( )
Delete h
Next
sleep
А это как я понял адаптация исходника java на FreeBasic:
Code
' //: c05:Games.java
' // An example of the Abstract Factory pattern.
' import com.bruceeckel.test.*;
' interface Obstacle {
' void action();
' }
Type Obstacle Extends Object
Declare Abstract Sub action()
End Type
' interface Player {
' void interactWith(Obstacle o);
' }
Type Player Extends Object
Declare abstract Sub interactWith (Byval o As Obstacle Ptr)
End Type
' class Kitty implements Player {
' public void interactWith(Obstacle ob) {
' System.out.print("Kitty has encountered a ");
' ob.action();
' }
' }
Type Kitty Extends Player
Declare Sub interactWith (Byval ob As Obstacle Ptr)
End Type
Sub Kitty.interactWith (Byval ob As Obstacle Ptr)
Print "Kitty has encountered a "
ob->action()
End Sub
' class KungFuGuy implements Player {
' public void interactWith(Obstacle ob) {
' System.out.print("KungFuGuy now battles a ");
' ob.action();
' }
' }
Type KungFuGuy Extends Player
Declare Sub interactWith (Byval ob As Obstacle Ptr)
End Type
Sub KungFuGuy.interactWith (Byval ob As Obstacle Ptr)
Print "KungFuGuy now battles a "
ob->action()
End Sub
' class Puzzle implements Obstacle {
' public void action() {
' System.out.println("Puzzle");
' }
' }
Type Puzzle Extends Obstacle
Declare Sub action ()
End Type
Sub Puzzle.action ()
Print "Puzzle"
End Sub
' class NastyWeapon implements Obstacle {
' public void action() {
' System.out.println("NastyWeapon");
' }
' }
Type NastyWeapon Extends Obstacle
Declare Sub action ()
End Type
Sub NastyWeapon.action ()
Print "NastyWeapon"
End Sub
' // The Abstract Factory:
' interface GameElementFactory {
' Player makePlayer();
' Obstacle makeObstacle();
' }
Type GameElementFactory Extends Object
Declare Abstract Function makePlayer () As Player Ptr
Declare Abstract Function makeObstacle () As obstacle Ptr
End Type
' // Concrete factories:
' class KittiesAndPuzzles
' implements GameElementFactory {
' public Player makePlayer() {
' return new Kitty();
' }
' public Obstacle makeObstacle() {
' return new Puzzle();
' }
' }
Type KittiesAndPuzzles Extends GameElementFactory
Declare Function makePlayer () As Player Ptr
Declare Function makeObstacle () As obstacle Ptr
End Type
Function KittiesAndPuzzles.makePlayer () As Player Ptr
Return New Kitty()
End Function
Function KittiesAndPuzzles.makeObstacle () As obstacle Ptr
Return New Puzzle()
End Function
' class KillAndDismember
' implements GameElementFactory {
' public Player makePlayer() {
' return new KungFuGuy();
' }
' public Obstacle makeObstacle() {
' return new NastyWeapon();
' }
' }
Type KillAndDismember Extends GameElementFactory
Declare Function makePlayer () As Player Ptr
Declare Function makeObstacle () As obstacle Ptr
End Type
Function KillAndDismember.makePlayer () As Player Ptr
Return New KungFuGuy()
End Function
Function KillAndDismember.makeObstacle () As obstacle Ptr
Return New NastyWeapon()
End Function
' class GameEnvironment {
' private GameElementFactory gef;
' private Player p;
' private Obstacle ob;
' public GameEnvironment(
' GameElementFactory factory) {
' gef = factory;
' p = factory.makePlayer();
' ob = factory.makeObstacle();
' }
' public void play() { p.interactWith(ob); }
' }
Type GameEnvironment
Private:
Dim As GameElementFactory Ptr gef
Dim As Player Ptr p
Dim As Obstacle Ptr ob
Public:
Declare Constructor (Byval factory As GameElementFactory Ptr)
Declare Sub play ()
End Type
Constructor gameEnvironment (Byval factory As GameElementFactory Ptr)
gef = factory
p = factory->makePlayer()
ob = factory->makeObstacle()
End Constructor
Sub gameEnvironment.play
p->interactWith(ob)
end sub
' public class Games extends UnitTest {
' GameElementFactory
' kp = new KittiesAndPuzzles(),
' kd = new KillAndDismember();
' GameEnvironment
' g1 = new GameEnvironment(kp),
' g2 = new GameEnvironment(kd);
' // These just ensure no exceptions are thrown:
' public void test1() { g1.play(); }
' public void test2() { g2.play(); }
' public static void main(String args[]) {
' Games g = new Games();
' g.test1();
' g.test2();
' }
' } ///:~
' ...
Dim As GameElementFactory Ptr kp, kd
kp = new KittiesAndPuzzles()
kd = new KillAndDismember()
Dim As GameEnvironment Ptr g1, g2
g1 = new GameEnvironment(kp)
g2 = new GameEnvironment(kd)
g1->play()
Print
g2->play()
Sleep
Delete g1
Delete g2
Delete kp
Delete kd