定义一个与基类型方法同名但签名不同的方法会产生两种不同的效果:
- 它可能使基类型方法无法通过派生类型访问,因此只会考虑派生类型中的定义。
- 它可以将新方法定义添加到从基本类型导入的定义列表中。
在某些情况下,第一个选项是正确的,而在某些情况下,第二个选项是正确的。与其猜测应该使用哪个选项,VB.NET 要求在创建一个与基类型函数同名但签名不同的函数时,程序员必须要么Shadows
指定第一个行为的关键字,要么指定指定第一个行为的Overloads
关键字第二。
尽管 Microsoft 使用公共方法自动生成接口实现,但在某些情况下,可能希望方法只能通过接口使用。因为 VB 允许独立于实现的接口成员的名称来指定函数的名称,所以可以使接口成员只能通过实现访问,方法是将其设为私有并为其指定不会与其他任何内容冲突的任何名称在类本身中使用(如果方法是私有的,则与派生类成员的冲突不会成为问题)。
选择一个任意不冲突的名称,同时将声明保留为公共可能几乎从来都不是正确的做法[人们应该将声明更改为私有,将声明Protected Overridable
更改为并将名称更改为更好的名称(例如SomeMember_Impl
),或者更改与接口成员匹配的名称,并根据需要添加Overloads
orShadows
关键字。在 的情况下IEquatable(Of T).Equals
,Overloads
关键字可能是最好的方法。
Incidentally, IEquatable(Of T)
should generally only be implemented by sealed classes (or structures, which are inherently sealed). It can provide a big performance win when applied to structures (it saves a boxing operation every time it's used), and a small performance win when applied to sealed classes (there's no need to check the type of its operand). When applied to unsealed types, it's difficult to ensure that for all derivative types the semantics of IEquatable(Of T).Equals(T)
will match those of Equals(Object)
except by having the former method chain to the latter. Such chaining would negate any performance advantage that could have been gained by implementing IEquatable(Of T)
in the first place.