我有以下示例:
public interface BaseCmd
{
object Content{get;set;}
}
public interface OverridedBaseCmd : BaseCmd
{
new object Content{get;}
}
所以这里的想法是将Content属性覆盖到新接口中,只有get。
如果我尝试在代码中使用content属性,它告诉我也实现了BaseCmd.Content属性,显然我不想这样做。任何想法我怎样才能做到这一点?
问候!
答案 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
的对象也必须工作,因为OverridedBaseCmd
是BaseCmd
的子类型。
答案 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();
}
}
但这是危险的行为,你应该考虑你的应用程序的架构。