C# 是否可以同时使用';新';和';覆盖';在财产的定义中?
我试图在我的应用程序中解决继承问题。基本上是这样的:C# 是否可以同时使用';新';和';覆盖';在财产的定义中?,c#,overriding,member-hiding,C#,Overriding,Member Hiding,我试图在我的应用程序中解决继承问题。基本上是这样的: 接口数据库 { int?值{get;} } 接口IAbc:IAbcBase { 新的int值{get;} } BaseA类:IAbcBase { 公共虚拟int?Value=>(这是一个)?.Value; } A类:BaseA、IAbc { //public override int?Value=>4;//行A public new int Value=>4;//行B } 我想从BaseA隐藏属性Value,并在A上用不可为空的属性替换它。
接口数据库
{
int?值{get;}
}
接口IAbc:IAbcBase
{
新的int值{get;}
}
BaseA类:IAbcBase
{
公共虚拟int?Value=>(这是一个)?.Value;
}
A类:BaseA、IAbc
{
//public override int?Value=>4;//行A
public new int Value=>4;//行B
}
我想从BaseA
隐藏属性Value
,并在A
上用不可为空的属性替换它。但同时,我还希望能够重写属性Value
,以便在我将Value
指定给类型为BaseA
的变量时为其提供更有效的定义
BaseA a=newa();
var b=a.值;//b是整数吗?这很好。但使用了无效的定义,而不是A行
是否可以以某种方式重写属性并同时隐藏它(即取消注释A行和B行)?在我的实际应用程序中,基类的定义并不是那么简单,我希望提供更有效的定义并隐藏该值
解决方案可能是不从基中隐藏成员,而是使用另一个名称。例如ValueNotNull
并将覆盖的方法标记为过时。但这并不是那么简单,因为我无法从接口IAbcBase
和IAbc
修改成员。我不喜欢这个解决方案,因为IAbc
的实现必须是明确的,这样我就可以覆盖BaseA
中的成员,然后我就不能在A
上使用nameValue
,这就是我想要的,因为它基本上是BaseA
上的Value
的不可空等价物
我希望我能很好地描述我的问题。如果需要任何详细信息,我将进行编辑
///编辑:
如果A行和B行的定义都被允许,我被要求提供用例的例子。在我的实际应用程序中,我有以下定义(简化):
内部密封类标准定义:定义
{
上一个公共定义{get;}
public new int NodesCount{get;}
}
内部密封类RootDefinition:定义
{
}
内部抽象类定义
{
public int?NodesCount=>(这是标准定义)?.NodesCount;
}
根节点基本上是国际象棋分析的起始位置,不一定是标准起始位置。NodeCount是用于分析此移动的节点数。这是我没有的根位置,因为我从来没有得到任何分析结果的起始位置,所以没有返回任何东西(有更多类似的属性,我简化了很多)
我主要使用
Definition
变量,除了分析完成后代码中的一个位置,我得到standardefinition
。因此,对NodesCount
和其他类似属性使用的大多是无效的定义,而不是使用StandardDefinition
中的定义。这就是我希望能够重写的原因,因为大多数实例的类型显然是StandardDefinition
。只有很少的RootDefinition
s。对于null的大多数转换和测试是绝对不必要的。在我分析位置之后,我得到了StandardDefinition
,现在我希望能够隐藏可为空的旧定义,并提供仅返回用于分析此位置的不可数节点计数的定义。再次避免所有不必要的强制转换等。不,基本上,如果您指的是A
上的公共API。唯一的解决方案是引入一个额外的层:
抽象类AlmostA:BaseA
{
公共覆盖int?Value=>GetValue();
受保护的int GetValue()=>4;
}
A类:阿尔莫斯塔、IAbc
{
public new int Value=>GetValue();
}
如果您的意思只是为了满足
IAbc
接口,那么“显式接口实现”就是您的朋友:
A类:BaseA、IAbc
{
private int GetValue()=>4;
公共覆盖int?Value=>GetValue();
int IAbc.Value=>GetValue();
}
如果要同时提供这两个属性(A行和B行),您能否澄清其预期用途?理想情况下,对于这两个属性的代码示例,您是否可以控制BaseA
,您可以将对Value
的调用委托给另一个受保护的属性,然后您可以在A
中重写该属性?@user1781290我可以访问该类,但它是有限的。我不想在那里添加公共和受保护的成员。谢谢!我可以在那里添加额外的层。这对我来说不是什么大问题,它很好地解决了我的问题。这种方法唯一的缺点是需要AlmostA
类。这感觉像是不必要的陈词滥调,但我可以接受