覆盖另一个接口中的接口方法

时间:2014-04-03 12:45:31

标签: c# wpf

我有以下示例:

public interface BaseCmd
{
   object Content{get;set;}
}

public interface OverridedBaseCmd : BaseCmd
{ 
   new object Content{get;}
}

所以这里的想法是将Content属性覆盖到新接口中,只有get。

如果我尝试在代码中使用content属性,它告诉我也实现了BaseCmd.Content属性,显然我不想这样做。任何想法我怎样才能做到这一点?

问候!

5 个答案:

答案 0 :(得分:3)

接口是一个契约,不应该被认为是继承,其中一个"覆盖"的东西。你基本上在这里说任何实现OverridedBaseCmd的东西都应该实现BaseCmd。即应该具有接口上定义的所有方法,属性等。

如果有人调用某个实现BaseCmd的类的BaseCmd.Content,但实际上并没有被OverridedBaseCmd覆盖,那么会发生什么。这违反了创建接口的概念,并打破了SOLID的Liskov替换。

如果您向我们提供有关您要实现的目标的更多信息,我们可能会提出更好的解决方案。

答案 1 :(得分:1)

你不能这样做。

如果这样可行,那么实现两者的对象(因为你总是实现每个基类型)只会在OverridedBaseCmd时提供getter,但在转换时仍会提供(它必须)setter作为BaseCmd

OverridedBaseCmd a = someObj;
a.Content; // works
a.Content = "foo"; // does not work

BaseCmd b = a; // same object
b.Content = "bar"; // works now

Liskov substitution principle不允许这样做。只要你有一个B类型的对象,其中B是A的子类型,那么你也可以在任何需要A类型的对象的地方使用该对象。所以在你的情况下,当某些东西需要一个类型为BaseCmd的对象 - 并且因此可以访问setter时 - 然后给它一个类型为OverridedBaseCmd的对象也必须工作,因为OverridedBaseCmdBaseCmd的子类型。

答案 2 :(得分:0)

你不能。

如果类X实现了接口Y,那么必须实现它定义的所有方法/属性。这包括所有propget / propset / eventadd / eventremove方法。

如果接口Z继承自接口Y,那么它包含来自Y的所有定义。没有办法"删除"任何通过继承的东西。简单而严格。

因此,如果Foo实现了继承自IBar的IZee,则意味着Foo实现了IZee IBar,因此必须涵盖所有内容

此外,没有办法去除"任何通过类继承的东西。如果你有类Foo继承自Bar,并且如果类Foo定义new object Content,那么Foo 仍然具有原始内容。它只是隐藏,但它仍然存在。

最后一件事:如果您真的要删除"设置",那么它会清楚地表明您的OverridedBaseCmd只是不应该继承自BaseCmd 。它们定义了不同的东西,它们允许不同的使用方式。他们不遵循is-a和Liskov的替代规则。

如果你真的想要这样做,你必须忍受额外不需要的方法。将它们保留为Throw-NotImplementedException,稍后会感到痛苦。尽量不要考虑离开他们"空"并且"什么都不做"。这将在以后更加痛苦。

答案 3 :(得分:0)

实现接口的类可以显式实现该接口的成员。当一个成员被显式实现时,它不能通过类实例访问,而只能通过接口的实例访问。

public class ImplementCmd : OverridedBaseCmd
{
    object content = null;
    object OverridedBaseCmd.Content
    {
        get { return this.content; }
    }

    object BaseCmd.Content
    {
        get
        {
            return this.content;
        }
        set
        {
            this.content = value;
        }
    }
}

显式实现还用于解决两个接口各自声明同名的不同成员(例如属性和方法)的情况。

interface ILeft
{
    int P { get;}
}
interface IRight
{
    int P();
}

要实现这两个接口,类必须对属性P或方法P或两者使用显式实现。

class Middle : ILeft, IRight
{
    public int P() { return 0; }
    int ILeft.P { get { return 0; } }
}

答案 4 :(得分:-1)

简单方法:

object Content
{
    get
    {
        // Your code here.
    }
}

BaseCmd.Content
{
    get
    {
        return this.Content;
    }
    set
    {
        throw new NotSupportedException();
    }
}

但这是危险的行为,你应该考虑你的应用程序的架构。