![]() |
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.
- Coersão do ponteiro convertido com o método de WSCbase: cast()
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.
O método de casting Descrição void* WSCbase::cast(char* className) retorna o ponteiro de uma classe específica.
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.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.
...
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();
}
}
#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.
Copyright(C) WideStudio Development Team, 1999-2005 | Last modified: Jan 05, 2005 |