[−][src]Trait glib::object::Cast
Upcasting and downcasting support.
Provides conversions up and down the class hierarchy tree.
Provided methods
fn upcast<T: ObjectType>(self) -> T where
Self: IsA<T>,
Self: IsA<T>,
Upcasts an object to a superclass or interface T
.
NOTE: This statically checks at compile-time if casting is possible. It is not always
known at compile-time, whether a specific object implements an interface or not, in which case
upcast
would fail to compile. dynamic_cast
can be used in these circumstances, which
is checking the types at runtime.
Example
let button = gtk::Button::new(); let widget = button.upcast::<gtk::Widget>();
fn upcast_ref<T: ObjectType>(&self) -> &T where
Self: IsA<T>,
Self: IsA<T>,
Upcasts an object to a reference of its superclass or interface T
.
NOTE: This statically checks at compile-time if casting is possible. It is not always
known at compile-time, whether a specific object implements an interface or not, in which case
upcast
would fail to compile. dynamic_cast
can be used in these circumstances, which
is checking the types at runtime.
Example
let button = gtk::Button::new(); let widget = button.upcast_ref::<gtk::Widget>();
fn downcast<T: ObjectType>(self) -> Result<T, Self> where
Self: CanDowncast<T>,
Self: CanDowncast<T>,
Tries to downcast to a subclass or interface implementor T
.
Returns Ok(T)
if the object is an instance of T
and Err(self)
otherwise.
NOTE: This statically checks at compile-time if casting is possible. It is not always
known at compile-time, whether a specific object implements an interface or not, in which case
upcast
would fail to compile. dynamic_cast
can be used in these circumstances, which
is checking the types at runtime.
Example
let button = gtk::Button::new(); let widget = button.upcast::<gtk::Widget>(); assert!(widget.downcast::<gtk::Button>().is_ok());
fn downcast_ref<T: ObjectType>(&self) -> Option<&T> where
Self: CanDowncast<T>,
Self: CanDowncast<T>,
Tries to downcast to a reference of its subclass or interface implementor T
.
Returns Some(T)
if the object is an instance of T
and None
otherwise.
NOTE: This statically checks at compile-time if casting is possible. It is not always
known at compile-time, whether a specific object implements an interface or not, in which case
upcast
would fail to compile. dynamic_cast
can be used in these circumstances, which
is checking the types at runtime.
Example
let button = gtk::Button::new(); let widget = button.upcast::<gtk::Widget>(); assert!(widget.downcast_ref::<gtk::Button>().is_some());
fn dynamic_cast<T: ObjectType>(self) -> Result<T, Self>
Tries to cast to an object of type T
. This handles upcasting, downcasting
and casting between interface and interface implementors. All checks are performed at
runtime, while downcast
and upcast
will do many checks at compile-time already.
It is not always known at compile-time, whether a specific object implements an interface or not, and checking as to be performed at runtime.
Returns Ok(T)
if the object is an instance of T
and Err(self)
otherwise.
Example
let button = gtk::Button::new(); let widget = button.dynamic_cast::<gtk::Widget>(); assert!(widget.is_ok()); let widget = widget.unwrap(); assert!(widget.dynamic_cast::<gtk::Button>().is_ok());
fn dynamic_cast_ref<T: ObjectType>(&self) -> Option<&T>
Tries to cast to reference to an object of type T
. This handles upcasting, downcasting
and casting between interface and interface implementors. All checks are performed at
runtime, while downcast
and upcast
will do many checks at compile-time already.
It is not always known at compile-time, whether a specific object implements an interface or not, and checking as to be performed at runtime.
Returns Some(T)
if the object is an instance of T
and None
otherwise.
Example
let button = gtk::Button::new(); let widget = button.dynamic_cast_ref::<gtk::Widget>(); assert!(widget.is_some()); let widget = widget.unwrap(); assert!(widget.dynamic_cast_ref::<gtk::Button>().is_some());
unsafe fn unsafe_cast<T: ObjectType>(self) -> T
Casts to T
unconditionally.
Panics
Panics if compiled with debug_assertions
and the instance doesn't implement T
.
Safety
If not running with debug_assertions
enabled, the caller is responsible
for ensuring that the instance implements T