D versus Objective C Comparison
Nick Sabalausky
a at a.a
Mon Feb 2 23:15:16 PST 2009
"Nick Sabalausky" <a at a.a> wrote in message
news:gm8pul$1eei$1 at digitalmars.com...
> "Michel Fortin" <michel.fortin at michelf.com> wrote in message
> news:gm8dhq$sj7$1 at digitalmars.com...
>> On 2009-02-02 21:19:52 -0500, Daniel Keep <daniel.keep.lists at gmail.com>
>> said:
>>
>>>
>>>
>>> Michel Fortin wrote:
>>>> [stuff]
>>>
>>> Wouldn't this be just as well served with Walter's "universal function
>>> syntax"; ie:
>>>
>>> void backup(File this, string backupPath)
>>> {
>>> copy(this.path, backupPath ~ "/" ~ this.name);
>>> }
>>>
>>> File someFile;
>>> someFile.backup(backupPath);
>>
>> It would work in your example, but not in mine. Note the difference:
>>
>> foreach(child; children)
>> child.backup(backupPath ~ "/" ~ this.name);
>>
>> Statically, child is a Node here. If at runtime child is a File, the
>> backup function is overriden by the FileBackup extension of File, so it'd
>> call the backup function from FileBackup, not NodeBackup. If at runtime
>> child is a Directory, it'll call DirectoryBackup's backup function. At
>> least, that's what it would do in Objective-C using categories. And
>> that's why you don't need the visitor pattern in Objective-C.
>>
>> --
>> Michel Fortin
>> michel.fortin at michelf.com
>> http://michelf.com/
>>
>
> I had been slowly coming around to the idea of having that universal
> function syntax instead of C#-style explicit extension methods, but maybe
> this need for dynamic dispatch is a good reason to prefer explicit
> extension methods:
>
> // As in C#, the "this" means backup() is an extension method
> void backup(this Node obj, string backupPath)
> {
> // base impl
> }
> void backup(this File obj, string backupPath)
> {
> copy(obj.path, backupPath ~ "/" ~ obj.name);
> }
> void backup(this Directory obj, string backupPath)
> {
> foreach(child; children)
> child.backup(backupPath ~ "/" ~ obj.name);
> }
>
> I'm not exactly sure what C# does in this case, but what I'm proposing
> here is that this could (somehow) cause dynamic dispatch to be used.
Out of curiosity, I just did a little test on this in C#. Apperently it
doesn't do any dynamic dispatch on this, it just calls the extension method
overload for whatever the static type is.
public class Base
{
}
public class Sub : Base
{
}
public static class ExtensionMethods
{
public static void foo(this Base obj)
{
System.Console.WriteLine("foo(Base)");
}
public static void foo(this Sub obj)
{
System.Console.WriteLine("foo(Sub)");
}
}
class Program
{
static void Main(string[] args)
{
Base obj = new Sub();
obj.foo(); // Output: foo(Base)
}
}
More information about the Digitalmars-d
mailing list