[疑难] overrid and overload

wangox 2007-12-16
import std.hiddenfunc;

class A
{
     void set(long i) { }
     void set(int i)  { }
}
class B : A
{
     void set(long i) { }
}

void foo(A a)
{   
    int i;
    try
    {
        a.set(3);   // error, throws runtime exception since
                    // A.set(int) should not be available from B
    }
    catch (HiddenFuncError o)
    {
	i = 1;
    }
    assert(i == 1);
}

void main()
{
    foo(new B);
}

D 里面为什么允许继承类重载(overload)基类的成员函数?
在C++中,认为这是一种不好的用法,绝对不应该这样做。我认为D应该直接在语言拒绝此用法,而不应该搞的这么复杂。




wangox 2007-12-16
怎样把代码缩进显示?
scroot 2007-12-16
Re: overrid and overload
sw2wolf 2007-12-16
>>D 里面为什么允许继承类重载(overload)基类的成员函数?
在C++中,认为这是一种不好的用法,绝对不应该这样做。我认为D应该直接在语言拒绝此用法,而不应该搞的这么复杂。

不是overload, 而是override基类的成员函数。
import std.stdio;

class A 
{ 
	void set(long i) { writefln("A: set(long)");} 
	void set(int i) { writefln("A: set(int)");} 
} 
class B : A 
{ 
	void set(long i) { writefln("B: set(long)");} 	
}

void foo(A a) 
{ 	
	a.set(3);
	a.set(5L);
}

void main() 
{ 
	foo(new B); 
}

输出:
A: set(int)
B: set(long)
wangox 2007-12-17
D语言规范里面:

If such an AliasDeclaration is not used, the derived class's functions completely override all the functions of the same name in the base class, even if the types of the parameters in the base class functions are different. If, through implicit conversions to the base class, those other functions do get called, an std.HiddenFuncError exception is raised。

gdc好像还没有实现。

如楼上所说,当调用a.set(1)时,调用不是B的set(long),一般来说不符合我们所期望的。

DavidL 2007-12-18
楼上的说法不对,关键你的override实在太烂,在如此含混的语义下又不知道细节还要override那么首先要责备的是设计师。设计师设计了如此糟糕的类应该好好反省。
再就是程序员在设计师设计的框架下没能读懂设计师精心设计的架构,是程序员水平不济。
但是主要责任在设计师,设计师永远不应该给出这样细微差别的设计,程序员即使有翻天的水平也很容易出错。
wangox 2007-12-19
这确实是设计的问题。所以我希望在语言这一层面上把问题给与纠正。
sw2wolf 2007-12-20
A's vtbl[] 看起来像:
A.vtbl[0] = &A.set(long);
A.vtbl[1] = &A.set(int);

B's vtbl[] 看起来像:
B.vtbl[0] = &B.set(long);
B.vtbl[1] = &A.set(int);

输出:
A: set(int)
B: set(long)
很正常!
Global site tag (gtag.js) - Google Analytics