覆盖另一个接口中的接口方法
本文关键字:接口 方法 覆盖 另一个 | 更新日期: 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
类型的对象也必须工作,因为OverridedBaseCmd
是 BaseCmd
的子类型。
你不能。
如果类 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-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();
}
}
但这是危险的行为,您应该考虑应用程序的体系结构。