WideStudio Logo
WideStudio
Programming Guide
WideStudio Index
Table of contents


Como fazer coerção (cast) da base WSCbase em um tipo específico

Para acessar o método de uma subclasse é necessário um ponteiro para a mesma. Então, deve-se proceder a uma coersão restritiva (downcast) do ponteiro de WSCbase para uma subclasse com algum método. A obtenção de coersão sobre um ponteiro será abordada neste capítulo.

  O método de casting  Descrição
void* WSCbase::cast(char* className)   retorna o ponteiro de uma classe específica.

Uso do método: WSCbase::cast() é como segue. No exemplo a seguir, o ponteiro "object" contém a intância WSCvtoggle, mas é um ponteiro de WSCbase*, e pontanto deseja-se acessá-lo pelo método WSCvtoglle "getStatus()" que retorna o estado de toggle.
Na linguagem C++, isto não é permitido uma coersão restritiva (downcast) tal como WSCbase* para WSCvtogle*. O método WSCbase::cast() realiza esta operação resolvendo o problema.

#include "WSCvtoggle.h" //access WSCvtoggle class.
...

void cbop(WSCbase* object){
//downcast WSCbase* to WSCvtoggle*.
WSCvtoggle* tgl = (WSCvtoggle*)object->cast("WSCvtoggle");

if (tgl == NULL){
// It fails, because the pointer "object"
// is not a WSCvtoggle instance.
}else{
// it succeeds, the pointer "object" is a WSCvtoggle instance.
// access the WSCvtoggle::getStatus()
WSCbool status = tgl->getStatus();
}
}

O método WSCbase::cast() retorna NULL, se a instância não é uma instância da classe específica. Se esta especificação é usada de forma correta, pode-se examinar a instância se é uma classe específica ou não.

#include "WSCvbtn.h" //access WSCvbtn class.
#include "WSCvtoggle.h" //access WSCvtoggle class.
...

void cbop(WSCbase* object){
//examine whether object is a WSCvlabel instance.
WSCvlabel* btn = (WSCvlabel*)object->cast("WSCvlabel");

//examine whether object is a WSCvtoggle instance.
WSCvtoggle* toggle = (WSCvtoggle*)object->cast("WSCvtoggle");

if (btn == NULL){
//it is not a WSCvbtn instance.
}else{
//it is a WSCvbtn instance or inherits WSCvbtn class.
}
if (toggle == NULL){
//it is not a WSCvtoggle instance.
}else{
//it is a WSCvtoggle instance or inherits WSCvtoggle class.
}

}

Se o procedimento de evento é usudo por alguma instância de várias classes, é útil alternar o programa.


Document Release 3.80 for WideStudio ver 3.80, Jan 2005


WideStudio documents index | Table of contents

Copyright(C) WideStudio Development Team, 1999-2005 Last modified: Jan 05, 2005