2013-11-20 22 views
0

基部操作者我有以下运算符重载代码匹配:如何使用上继承的类操作过载到在c#

public static Set operator+(Set left, Set right) 
{ 
    Set sum=new Set(left.Capacity+right.Capacity); 
    for (left.iterator_init(); !left.iterator_end(); left.iterator_next()) 
     sum.add_member(left.iterator_current()); 
    for (right.iterator_init(); !right.iterator_end(); right.iterator_next()) 
     sum.add_member(right.iterator_current()); 
    return sum; 
} 

集与INT数字数组与Capcity长度的类。

函数add_member在数组中插入一个数字。

我也有一类OrderedSet继承设置是这样的:

class OrderedSet : Set 

在这个类我重写“add_member”功能的嵌入式数字上升。 现在我想用父类(Set)运算符+重载与OrderedSet完全相同的方式,以某种方式不必再次重写函数,而是依赖父类的重载。 所以,如果我想改变我添加两个集或OrderedSets的方式,我将不得不在Set上更改操作员代码。

我尝试这样做:

public static OrderedSet operator+(OrderedSet left, OrderedSet right):base(left,right) 
    { 

    } 

,但没有运气,我得到的语法错误。 那么,我错过了什么?

+0

您的基本运算符+返回'Set',您无法将其转换为OrderedSet'。 – Vladimir

回答

1

我认为这样做最巧妙的方法是提供一个Set构造函数,通过合并两套

protected Set(Set left, Set right) 
{ 
    this.Capacity = left.Capacity + right.Capacity; 
    for (left.iterator_init(); !left.iterator_end(); left.iterator_next()) 
     this.add_member(left.iterator_current()); 
    for (right.iterator_init(); !right.iterator_end(); right.iterator_next()) 
     this.add_member(right.iterator_current()); 
} 

,你可以在你的OrderedSet类重用创建一组

protected OrderedSet(OrderedSet left, OrderedSet right) 
    : base(left, right) 
{ 

} 

,然后在添加覆盖项中重用:

public static Set operator +(Set left, Set right) 
{ 
    return new Set(left, right); 
} 

public static OrderedSet operator +(OrderedSet left, OrderedSet right) 
{ 
    return new OrderedSet(left, right); 
} 

这样,如果共享的“连接两组”逻辑更改,则只需在一个位置更改它,并且如果要使OrderedSet使用其自己的逻辑,则可以停止调用base构造函数。

+0

除了那个Set使用的new_member函数也用于OrderedSet的事实之外,它几乎可以完美地工作。 –

+0

Nvm,我用虚拟和覆盖,一切都很好! –

+0

你的意思是'add_member'?从理论上讲,你可以在'OrderedSet'的'Set'和'override'上创建'virtual'方法,构造函数会调用正确的版本,但是理论上从构造函数中调用override方法是个坏主意: (只要你知道你在做什么,我想就可以了。) – Rawling

2

由于运算符的方法是静态的,因此生成错误。在静态方法中不能使用base关键字。

因此,使用:是不可能的 - 但可以直接在方法体内调用基类。

public class Foo 
{ 
    public static int Jump(int height) 
    { 
     return height * 10; 
    } 
} 

public class Bar : Foo 
{ 
    public static int Jump(int height) 
    { 
     return Foo.Jump(height); 
    } 
} 
0

您可以调用Set版本,但由于它返回Set,所以在返回之前必须将Set转换为OrderedSet。

public static OrderedSet operator+(OrderedSet left, OrderedSet right) 
{ 
    Set mySet = (Set)left+(Set)right; 
    return SoSomethingToConvertYourSetToAnOrderedSet(mySet); 
}