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
上使用name
Value
,这就是我想要的,因为它基本上是
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
类。这感觉像是不必要的陈词滥调,但我可以接受