2013-12-09 166 views
1

假设我们有一个接口层次结构:IBaseThing<T>IChildThing:IBase<ChildThing>。 也有两类这样的:接口继承和抽象方法覆盖

internal abstract class Base<T> 
{ 
    public abstract IBaseThing<T> Thing {get;} 
} 

internal class Concrete:Base<ChildThing> 
{ 
    public override IChildThing Thing 
    { 
     get 
     { 
      return GetChildThing(); 
     } 
    } 
} 

会发生什么事是波纹管:

'混凝土' 不实现继承的抽象成员 “基地。得到'

我想跳过(IChildThing)this.Thing整个Concrete类。 我该怎么办?

+0

'IChildThing:IBase '是一个难以置信的臭接口。可能是你想'ChildThing:IBase '..不能确定.. – nawfal

+0

错误的假设nawfal。 IThings不是T. –

+0

Reza,请将完整的示例(但仅限于需要的内容)和后面的用例发布。我们可以帮助你更好。否则,它的所有假设。 – nawfal

回答

2

你不能做到这一点。类型系统正确地反对你试图改变覆盖类中的方法类型。 IChildThing可能来自IBaseThing,但它不是一回事。例如,您可能稍后在IChildThing中添加更多方法。然后,一个类(具体)将承诺一个返回的对象与基类有不同的签名 - 这是一个类型错误。

如果需要指IChildThing在某些情况下,怎么样是这样的:

internal class Concrete : Base<ChildThing> 
{ 
    public override IBaseThing<ChildThing> Thing 
    { 
     get { return ChildThing; } 
    } 

    public IChildThing ChildThing { get; set; } 
} 

如果你已经是虽然基地,那么你就不能在IChildThing获得安全。这就是这种强类型系统的本质。如果这是一个问题,那么如果你给出了一个更具体的例子,我可能会建议如何重组以避免这个问题。

+0

我现在无法弄清楚“Thing”属性的用法!我将Thing声明为可以从其他类访问的属性。这在内部是有效的,但实际上你忽视了财产哲学。对? –

+1

你是什么意思我忽略了“财产哲学”?我不熟悉你的意思。 –

+0

我们指定一个属性来为其他类提供获取和设置,这意味着私有属性是不合理的,相反我们可以使用私有域。在你的解决方案中,'IBaseThing 事情'是不会消耗的,因为IChildThing在其他类中没有投射,这不是我正在寻找的。 –

2

尝试这种解决方案:

public interface IBaseThing {} 

public interface IChildThing : IBaseThing {} 

internal abstract class Base<T> where T : IBaseThing 
{ 
    public abstract T Thing {get;} 
} 

internal class Concrete:Base<IChildThing> 
{ 
    public override IChildThing Thing 
    { 
     get 
     { 
      return GetChildThing(); 
     } 
    } 

    public IChildThing GetChildThing() 
    { 
     // Your impelementation here... 
     return null; 
    } 
} 
+0

这是编译吗?我不确定.. – nawfal

+2

这不就是这个问题吗? –

+0

这正是我想要做的,但我有上面的错误。 –