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

本文关键字:接口 方法 覆盖 另一个 | 更新日期: 2023-09-27 17:56:19

我有以下示例:

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

因此,这里的想法是将 Content 属性重写到新界面中以仅具有 get。

如果我尝试在代码中使用内容属性,它会告诉我也实现 BaseCmd.Content 属性,显然我不想这样做。任何想法如何实现这一目标?

问候!

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

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

如果有人调用某个实现 BaseCmd 但实际上没有实现 BaseCmd 的

类的 BaseCmd.Content 集,会发生什么,因为它被 OverridedBaseCmd 覆盖了。这违反了为SOLID创建接口的概念,并破坏了SOLID的Liskov替换。

如果您向我们提供有关您要完成的任务的更多信息,我们可能会建议更好的解决方案。

你不能这样做。

如果这有效,那么实现两者的对象(因为你也总是实现每个基类型)将只提供 getter 当它是一个OverridedBaseCmd,但在投射为 BaseCmd 时仍然会提供(它必须)setter :

OverridedBaseCmd a = someObj;
a.Content; // works
a.Content = "foo"; // does not work
BaseCmd b = a; // same object
b.Content = "bar"; // works now

利斯科夫替代原则不允许这样做。只要您有一个 B 类型的对象,其中 B 是 A 的子类型,那么您也可以在需要 A 类型的对象的任何位置使用该对象。因此,在您的情况下,当某些东西需要 BaseCmd 类型的对象时 - 因此可以访问 setter - 那么给它一个 OverridedBaseCmd 类型的对象也必须工作,因为OverridedBaseCmdBaseCmd 的子类型。

你不能。

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

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

因此,如果Foo实现了从IBar继承的IZee,

那么这意味着Foo同时实现了IZeeIBar,因此必须涵盖两者的所有内容

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

最后一件事:如果你真的想删除那个"集合",那么它清楚地表明你的OverridedBaseCmd根本不应该继承BaseCmd。它们定义了不同的东西,它们允许不同的使用方式。他们不遵循is-a或Liskov的替代规则。

如果你真的真的想以这种方式拥有它,你必须忍受额外的不需要的方法。将它们保留为 Throw-NotImplementException,稍后再感受痛苦。尽量不要考虑让他们"空虚"和"无所事事"。这以后会更加痛苦。

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

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; } }
}

简单的方法:

object Content
{
    get
    {
        // Your code here.
    }
}
BaseCmd.Content
{
    get
    {
        return this.Content;
    }
    set
    {
        throw new NotSupportedException();
    }
}

但这是危险的行为,您应该考虑应用程序的体系结构。

相关文章: