1

我试图解决我的应用程序中的继承问题。基本上是这样的:

interface IAbcBase
{
    int? Value { get; }
}

interface IAbc : IAbcBase
{
    new int Value { get; }
}

class BaseA : IAbcBase
{
    public virtual int? Value => (this as A)?.Value;
}

class A : BaseA, IAbc
{
    // public override int? Value => 4;     // line A
    public new int Value => 4;              // line B
}

我想隐藏属性并将其替换Value为. 但同时我也希望能够覆盖属性以提供更有效的定义,以防我将它分配给 type 的变量。BaseAAValueValueBaseA

BaseA a = new A();
var b = a.Value; // b is int? which is fine. But ineffective definition was used instead of line A

是否有可能以某种方式覆盖属性并同时隐藏它(即取消注释 A 和 B 行)?在我的实际应用程序中,基类的定义并不那么简单,我希望提供更有效的定义并隐藏该值。

解决方案可能是不从基础中隐藏成员,而是使用另一个名称。例如ValueNotNull并将覆盖的方法标记为已过时。但这并不是那么简单,因为我无法从接口IAbcBaseIAbc. 我不喜欢这个解决方案,因为那时的实现IAbc必须是显式的,所以我可以覆盖成员BaseA,然后我不能使用我想要的名称ValueA因为它基本上是不可为空的等价于Valueon BaseA

我希望我能很好地描述我的问题。如果需要任何细节,我会编辑

/// 编辑:如果允许 A 行和 B 行上的定义,我被要求提供用例示例。在我的实际应用程序中,我有以下定义(简化):

    internal sealed class StandardDefinition : Definition
    {
        public Definition Previous { get; }

        public new int NodesCount { get; } 
    }

    internal sealed class RootDefinition : Definition
    {
    }

    internal abstract class Definition
    {
        public int? NodesCount => (this as StandardDefinition)?.NodesCount;
    }

根节点基本上是国际象棋分析的开始位置,不一定是标准的开始位置。NodesCount 是用于分析此移动的节点数。这是我没有根位置的东西,因为我从来没有从任何分析中得到起始位置,所以没有什么可以返回(有更多这样的属性,我简化了很多)。

Definition分析完成后,我主要使用代码中除一处以外的变量,我得到StandardDefinition. 因此,大多数无效的定义NodesCount和其他类似属性被使用,而不是使用定义 from StandardDefinition。这就是我希望能够覆盖的原因,因为大多数实例显然是StandardDefinition. 只有几个RootDefinitions。大多数对 null 的强制转换和测试是绝对没有必要的。在我分析了位置之后,我得到StandardDefinition了,现在我希望能够隐藏可以为空的旧定义并提供只返回用于分析该位置的不可为数的节点数的定义。再次避免所有不必要的铸造等。

4

1 回答 1

1

不,基本上,如果您指的是A. 唯一的解决方案是引入一个额外的层:

abstract class AlmostA : BaseA
{
    public override int? Value => GetValue();
    protected int GetValue() => 4;
}
class A : AlmostA, IAbc
{
    public new int Value => GetValue();
}

如果您只是为了满足IAbcinterface的目的,那么“显式接口实现”是您的朋友:

class A : BaseA, IAbc
{
    private int GetValue() => 4;
    public override int? Value => GetValue();
    int IAbc.Value => GetValue();
}
于 2019-07-18T12:52:16.720 回答