C# 接口继承和抽象方法重写

C# 接口继承和抽象方法重写,c#,inheritance,interface,abstraction,C#,Inheritance,Interface,Abstraction,假设我们有一个接口层次结构:IBaseThing和IChildThing:IBase。 还有两个类似的类: internal abstract class Base<T> { public abstract IBaseThing<T> Thing {get;} } 内部抽象类基类 { 公共抽象设置对象{get;} } 及 内部等级混凝土:基础 { 公众压倒一切 { 收到 { 返回GetChildThing(); } } } 将发生的情况如下: “Concre

假设我们有一个接口层次结构:
IBaseThing
IChildThing:IBase
。 还有两个类似的类:

internal abstract class Base<T>
{
    public abstract IBaseThing<T> Thing {get;}
}
内部抽象类基类
{
公共抽象设置对象{get;}
}

内部等级混凝土:基础
{
公众压倒一切
{
收到
{
返回GetChildThing();
}
}
}
将发生的情况如下:

“Concrete”未实现继承的抽象成员 “基地,开始”

我想跳过在整个
混凝土
类中铸造
(IChildThing)这个.Thing。
我该怎么办?

试试这个解决方案:

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;
     }
}
公共接口IBaseThing{}
公共接口IChildThing:IBaseThing{}
内部抽象类基类,其中T:ibasetting
{
公共抽象T事物{get;}
}
内部等级混凝土:基础
{
公众压倒一切
{
收到
{
返回GetChildThing();
}
}
公共的IChildThing GetChildThing()
{  
//你在这里的推进。。。
返回null;
}
}
尝试以下解决方案:

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;
     }
}
公共接口IBaseThing{}
公共接口IChildThing:IBaseThing{}
内部抽象类基类,其中T:ibasetting
{
公共抽象T事物{get;}
}
内部等级混凝土:基础
{
公众压倒一切
{
收到
{
返回GetChildThing();
}
}
公共的IChildThing GetChildThing()
{  
//你在这里的推进。。。
返回null;
}
}

你不能那样做。类型系统正确地反对您尝试更改重写类中的方法类型。IChildThing可能源于iBasetting,但它不是同一件事。例如,稍后您可能会向IChildThing添加更多的方法。然后一个类(具体的)将承诺返回的对象具有与基类不同的签名-这是一个类型错误

如果您在某些情况下需要参考IChildThing,那么以下内容如何:

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

    public IChildThing ChildThing { get; set; }
}
内部等级混凝土:基础
{
公物
{
获取{return ChildThing;}
}
公共IChildThing子对象{get;set;}
}

如果你只有一个基地,那么你就不能安全地到达IChildThing。这就是像这样的强类型系统的本质。如果这是一个问题,那么如果你给出一个更具体的例子,我可能会建议如何重组以避免这个问题。

你不能这样做。类型系统正确地反对您尝试更改重写类中的方法类型。IChildThing可能源于iBasetting,但它不是同一件事。例如,稍后您可能会向IChildThing添加更多的方法。然后一个类(具体的)将承诺返回的对象具有与基类不同的签名-这是一个类型错误

如果您在某些情况下需要参考IChildThing,那么以下内容如何:

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

    public IChildThing ChildThing { get; set; }
}
内部等级混凝土:基础
{
公物
{
获取{return ChildThing;}
}
公共IChildThing子对象{get;set;}
}


如果你只有一个基地,那么你就不能安全地到达IChildThing。这就是像这样的强类型系统的本质。如果这是一个问题,那么如果你给出一个更具体的例子,我可能会建议如何重组以避免这个问题。

这不就是问题所在吗?这正是我想要做的,但我有上面的错误。关于更新:事情必须是接口。这些公共接口有一些内部实现。@Alexander我的评论是在更新之前。顺便说一句,我建议将类型定义更改为
类基,其中T:ibasetting
或类似的内容。一个约束条件会很好。@Reza Owliaei,好吧,看来,我没有完全弄清楚你的问题。请添加IBaseThing、IChildThing接口和ChildThing类的定义。这与问题不一样吗?这正是我想要做的,但我有上面的错误。关于更新:事情必须是接口。这些公共接口有一些内部实现。@Alexander我的评论是在更新之前。顺便说一句,我建议将类型定义更改为
类基,其中T:ibasetting
或类似的内容。一个约束条件会很好。@Reza Owliaei,好吧,看来,我没有完全弄清楚你的问题。请添加IBaseThing、IChildThing接口和ChildThing类的定义。
IChildThing:IBase
是一个非常难闻的接口。可能是你想要的
ChildThing:IBase
。。不能肯定……错误的假设,纳瓦尔。我的东西不是T.Reza,请发布完整的示例(但仅是所需的)和之后的用例。我们可以更好地帮助你。否则,这就是所有假设。
IChildThing:IBase
是一个令人难以置信的臭接口。可能是你想要的
ChildThing:IBase
。。不确定…假设错误。我的东西不是T.Reza,请发布完整的示例(但仅是所需的)和之后的用例。我们可以更好地帮助你。否则一切都是假设。我现在搞不清楚
的东西
的用途!我将该对象声明为可从其他类访问的属性。这在内部是可行的,但实际上您忽略了属性哲学。对吧?你说我忽略了“财产哲学”是什么意思?我不熟悉你的意思。我们指定一个属性来为其他类提供get和set,这意味着私有属性是不合理的,我们可以使用私有字段。在您的解决方案中,
IBaseThing Thing
在其他类中不能像IChildThing那样使用,而不使用强制转换,这不是我想要的。我已经更新了我的答案,以便其他类也可以使用IChildThing。然而