Re: New 'GObject' as base for GtkObject?
- From: Guillaume Laurent <glaurent worldnet fr>
- To: gtk-devel-list redhat com
- Subject: Re: New 'GObject' as base for GtkObject?
- Date: 22 Dec 1999 14:01:07 +0100
Owen Taylor <otaylor@redhat.com> writes:
> > (separate idea) How do you export specific pieces of the
> > interface? For example, a frame has 2 container interfaces. I
> > want to pass one of them to something that is going to add a
> > dialog in. How would I code that? How would that reference so
> > that it could call signals?
>
> I don't see this as inheritance - the classic dictum is that
> inheritance models is_a relationships, not has_a
> relationships. [...] The right way to do this is with aggregation
> or helper objects (more below)
You're absolutely right.
> I've been working some with Python recently, and in
> a language like Python that has first class function objects,
> the way to do this is obvious:
>
> def place_tic_tack_toe (self, func):
> func(self.thing_to_place)
>
> place_tic_tack_toe(paned.add1)
>
> That just works right now. Almost like cheating, isn't it? I'd do the
> same thing in Scheme, and maybe even Perl, thoughj neither is as
> compact. Unfortunately, function pointers in C or C++ aren't as
> powerful, or as convenient, but you could pass in a function / closure
> data pair, or you could use helper objects.
You can have function objects in C++. Yes, it's yet another idiom (and
it can look really ugly), but it's widely used, extremely well known
and fairly close to the original idea.
> Helper objects is probably the way I'd do things in C++ or Java
> ... something like:
You might like this better :
////////////////////
class Gtk_AddInPaned : public Placer // this will be your function object
{
Gtk_AddInPaned(Gtk_Paned &paned, int side) : mPaned(paned), mSide(side) {};
void operator()(Gtk_Widget &child);
private:
Gtk_Paned &mPaned;
int mSide;
};
Gtk_AddInPaned::operator()(Gtk_Widget &child)
{
if (mSide == 1)
mPaned.add1 (child);
else
mPaned.add2 (child);
}
/// and in your TicTackToe class, you have :
TicTackToe::place(Placer &placer)
{
placer(*this);
}
/////////// and this can be used as follows :
Gtk_Paned myPaned;
TicTackToe myTickTackToe;
myTickTackToe.place(Gtk_AddInPaned(myPaned, 1));
Who said operator overloading was evil ? :-)
--
Guillaume
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]