如何通过接口继承在C#中重新定义一个属性?
How to redefine a property in C# through interface inheritance?
我有一个接口 'IBase',它指定了一个可为 null 的 int。后来的接口 'IDerived' 隐藏了可为空的 int 并且 'redefines' 将其隐藏为不可为空的。
interface IBase
{
int? Redefineable { get; set; }
}
interface IDerived : IBase
{
new int Redefineable { get; set; }
}
实现这些接口的 class 必须显式实现隐藏的 属性,但是它是私有的,因此客户端看不到它。
class TheClass : IDerived
{
public int Redefineable { get; set; }
int? IBase.Redefineable { get; set; }
}
但是,即使它是私有的属性,我仍然可以通过IBase 接口访问它!
var o = new TheClass();
o.Redefineable = 1; // ok
var hack = o as IBase;
hack.Redefineable = null; // uh!
这似乎违反了 C# 访问修饰符,但无论哪种方式,它都不是我真正想要的重新定义(不仅仅是隐藏)属性。从某种意义上说,它是正确的,它按照您的要求进行操作,获得一个具有可为空 int 的 IBase 接口,但这对客户来说是不直观的,客户可以修改 wrong 版本属性。
我真正想要的是,如果客户端访问 IBase.Redefinable,那么它的行为就好像它正在访问 IDerived.Redefinable 属性、'real' 属性 的 TheClass。这样它实际上被重新定义了,就像在层次结构中一样。
class TheClass : IDerived
{
public int Redefineable { get; set; }
int? IBase.Redefineable {
get {
// redirect to redefined property
return this.Redefineable;
}
set
{
// stop client setting it to null
if (!value.HasValue)
throw new InvalidOperationException();
// redirect to redefined property
this.Redefineable = value.Value;
}
}
}
这感觉就像一个 hack,几乎就像我遗漏了什么,所以我想问一下是否有人知道 better/alternative 实现可重新定义属性的方法?
However, even though it's a private property, I can still access it through the IBase interface!
这不是私人 属性。它只是一个 属性 使用显式接口实现。这意味着它是 public 通过界面,但 只有 通过界面可用。显式接口实现主要是为了"contradictory"接口的实现变得可行,以及用于"discourage"(但不禁止)某些接口方法的使用。 不是是为了给人一种成员根本不存在的印象。
从根本上说,听起来您不应该在这里使用继承 - 如果您不希望某些东西能够充当 IBase
,您不应该从 IBase
继承.
我有一个接口 'IBase',它指定了一个可为 null 的 int。后来的接口 'IDerived' 隐藏了可为空的 int 并且 'redefines' 将其隐藏为不可为空的。
interface IBase
{
int? Redefineable { get; set; }
}
interface IDerived : IBase
{
new int Redefineable { get; set; }
}
实现这些接口的 class 必须显式实现隐藏的 属性,但是它是私有的,因此客户端看不到它。
class TheClass : IDerived
{
public int Redefineable { get; set; }
int? IBase.Redefineable { get; set; }
}
但是,即使它是私有的属性,我仍然可以通过IBase 接口访问它!
var o = new TheClass();
o.Redefineable = 1; // ok
var hack = o as IBase;
hack.Redefineable = null; // uh!
这似乎违反了 C# 访问修饰符,但无论哪种方式,它都不是我真正想要的重新定义(不仅仅是隐藏)属性。从某种意义上说,它是正确的,它按照您的要求进行操作,获得一个具有可为空 int 的 IBase 接口,但这对客户来说是不直观的,客户可以修改 wrong 版本属性。
我真正想要的是,如果客户端访问 IBase.Redefinable,那么它的行为就好像它正在访问 IDerived.Redefinable 属性、'real' 属性 的 TheClass。这样它实际上被重新定义了,就像在层次结构中一样。
class TheClass : IDerived
{
public int Redefineable { get; set; }
int? IBase.Redefineable {
get {
// redirect to redefined property
return this.Redefineable;
}
set
{
// stop client setting it to null
if (!value.HasValue)
throw new InvalidOperationException();
// redirect to redefined property
this.Redefineable = value.Value;
}
}
}
这感觉就像一个 hack,几乎就像我遗漏了什么,所以我想问一下是否有人知道 better/alternative 实现可重新定义属性的方法?
However, even though it's a private property, I can still access it through the IBase interface!
这不是私人 属性。它只是一个 属性 使用显式接口实现。这意味着它是 public 通过界面,但 只有 通过界面可用。显式接口实现主要是为了"contradictory"接口的实现变得可行,以及用于"discourage"(但不禁止)某些接口方法的使用。 不是是为了给人一种成员根本不存在的印象。
从根本上说,听起来您不应该在这里使用继承 - 如果您不希望某些东西能够充当 IBase
,您不应该从 IBase
继承.