On 2009-02-01 14:45:58 -0500, Walter Bright <newshou...@digitalmars.com> said:

Setting aside the technical issues for the moment, isn't that exactly what inheritance is supposed to be good for?

I'll attempt a better example of something useful with class extensions. Say you have these classes:

        class Node
        {
                string path();
                string name();
        }

        class File : Node
        {
                ...
        }

        class Directory : Node
        {
                Node[] children();
                ...
        }

And a couple of functions returning directories and files:

        File getConfigFile();
        Directory getResourceDirectory();
        Directory getDataDirectory();

Now, you may not have control over these functions, if you subclass File or Directory to do what you want, it won't cause these functions to magically create instances of your class.

Say you want to implement a backup function traversing the filesystem tree. In Objective-C, I'd simply create a category adding a new method. If you had something like it in D, it could look like this:

        extension NodeBackup : Node
        {
                void backup(string backupPath) { }
        }

Where I'm extending Node with an extension named NodeBackup, allowing me to call the backup function as if it was a member of Node. From there, I create another extension for File, overriding the backup function provided by NodeBackup:

        extension FileBackup : NodeBackup, File
        {
                override void backup(string backupPath)
                {
                        copy(this.path, backupPath ~ "/" ~ this.name);
                }
        }

And so on for Directory.

        extension DirectoryBackup : NodeBackup, Directory
        {
                override void backup(string backupPath)
                {
                        foreach(child; children)
                                child.backup(backupPath ~ "/" ~ this.name);
                }
        }

All this you can do with the visitor pattern if you need to. But the visitor pattern is a lot more clumbersome to implement, and much less natural to use...

        getDataDirectory.backup("/backup_disk");

vs. something like this:

        getDataDirectory.accept(new BackupVisitor("/backup_disk"));


--
Michel Fortin
michel.for...@michelf.com
http://michelf.com/

Reply via email to