如何在派生类中实现接口或通过部分类实现接口?

5
我有一个部分类被工具生成。 Foo.cs
public partial class Foo {
    [SomeAttribute()]
    public string Bar {get;set;}
}

我需要在不修改Foo.cs的情况下,为Foo实现以下接口:
IFoo.cs
public interface IFoo {
    string Bar {get;set;}
}

“Extending Foo”是一种选择,但重新实现“Bar”属性则不是。这个可以做到吗?

如果这是你所要求的,为什么你不能扩展Foo:IFoo? - Tigran
@Tigran:我无法触碰Foo.cs文件。 - Ropstah
@DBM:如其他地方所述.. Bar 应该是公共的。 - Ropstah
3个回答

8

您为什么不能在另一个文件中重复操作?

public partial class Foo : IFoo
{
}

由于已经存在 Bar 属性,因此无需重新实现它。

或者在一个新的类中实现。

public class FooExtended : Foo, IFoo
{
}

由于Foo已经实现了Bar,因此您不需要再实现它。


1
部分类选项有限制。您需要将文件放在同一程序集中。扩展类选项应该可以普遍使用。编译错误是什么? - Tomislav Markovski
无论如何,除非它是虚拟的,否则您无法重新实现Bar,因此这是正确的方法。 - Alex
什么错误?这应该可以工作,我以前做过。请注意,其他部分类文件需要在相同的命名空间中。 - ryber
'FooExtended' 没有实现接口成员 'IFoo.Bar'。 - Ropstah
@DBM:我的错,Bar是公共的! - Ropstah
它确实可以工作。生成的文件包含了更多的类。我正在对错误的类进行“分部”操作! - Ropstah

1
你可以为Foo创建一个实现IFoo的部分类,但由于Bar属性不是公共的,所以它不起作用。
如果Bar属性是公共的:
partial class Foo
{
    public string Bar { get; set; }
}

interface IFoo
{
    string Bar { get; set; }
}

partial class Foo : IFoo
{

}

请看我的@Tomislav Markovski,Bar 应该是公共的。 - Ropstah

1

由于Bar是私有的,这是您要找的内容:

public partial class Foo : IFoo
{
    string IFoo.Bar
    {
        get
        {
            return this.Bar;  // Returns the private value of your existing Bar private field
        }
        set
        {
            this.Bar = value;
        }
    }
}

无论如何,这很令人困惑,如果可能的话应该避免。

编辑:好的,你改变了你的问题,所以现在Bar是公共的,因此没有问题,因为Bar总是在Foo中实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接