2013-10-15 62 views
3

我想寫一個抽象類型是否可以在Fortran 2003的類型中實現「抽象」變量?

type, abstract :: Vehicle 
    real, dimension(:), allocatable:: Wheels 
    contains 
    procedure (Compute_Weight), deferred :: VehicleWeight 
end type Vehicle 

即我想有一個陣列中的抽象類型的佔位符以這樣的方式,它可以被覆蓋或擴展類型與重新定義像

type, extends(Vehicle) :: Bike 
    allocate(Wheels(2)) 
    contains 
    procedure :: VehicleWeight => BikeWeight 
end type Bike 

    type, extends(Vehicle) :: Car 
    allocate(Wheels(4)) 
    contains 
    procedure :: VehicleWeight => CarWeight 
end type Car 

GCC編譯器抱怨(正當我猜),以及onlys解決方案,我可以找到這個問題僅僅是不是抽象類型聲明的分配功能,並直接與內正確的大小聲明變量方式。 不過,我希望有一種佔位符來強制執行Wheels(原型)描述的基本屬性。 I

回答

7

組件的分配是可執行操作 - 它需要出現在源代碼的可執行部分。考慮是這樣的:

type, abstract :: vehicle 
    real, dimension(:), allocatable :: wheels 
    ... 
end type 

type, extends(vehicle) :: bike 
    ... 
end type bike 

type, extends(vehicle) :: car 
    ... 
end type car 

interface bike 
    procedure bike_constructor 
end interface bike 

interface car 
    procedure car_constructor 
end interface car 

... 

function bike_constructor() 
    type(bike) :: bike_constructor 
    allocate(bike_constructor%wheels(2)) 
    ... 
end function bike_constructor 

function car_constructor() 
    type(car) :: car_constructor 
    allocate(car_constructor%wheels(4)) 
    ... 
end function car_constructor 

在Fortran的2008年,這可以通過以下簡單的方式來使用:

class(vehicle), allocatable :: obj 
IF (i_feel_like_some_exercise) THEN 
    obj = bike() 
ELSE 
    obj = car() 
END IF 
PRINT "('My object has ',I0,' wheels!')", SIZE(obj%wheels) 

2003年的Fortran,內部賦值給一個多態對象不支持。需要使用在ALLOCATE語句中使用SOURCE說明符等變通方法。

公共和私人組件和程序的適當應用可以進一步指導和約束客戶端代碼以正確的方式與類型進行交互。