1

IFooインターフェイスといくつかのメンバーがあるとしましょうMember。それを実装するクラスは、インターフェイスからのメンバーを実装する同時に、まったく同じ名前の「新しい」メンバーを追加できます。

それは本当に素晴らしいです。今、私は似たようなものを引きたいと思っていますが、インターフェースからではなく、抽象クラスから来ています。インターフェイスと同様の動作を期待します-抽象クラスのインスタンスがあると、元のメンバーが表示され、派生クラスのインスタンスがあると、「新しい」メンバーが表示され、元のメンバーは非表示になります。

私はこのようなことを念頭に置いています:

abstract class AFoo
(
  public abstract string Member { get; }
}

class Foo : AFoo
{
  public override string Member { get; } // this is the one coming from AFoo

  public new int Member { get; } // does not work (try 1)
  string AFoo.Member { get; } // works only with interfaces (try 2)
}

これを許可するメカニズムはありますか?

更新: には 2 人のメンバーがいますFoo。私は 2 つの試行を書きました。使用方法はインターフェイスと同じです。

var foo = new Foo();
AFoo afoo = foo;
foo.Member; // gets int
afoo.Member; // gets string
4

1 に答える 1

2

InterFoo抽象クラスを継承し、必要なメンバーを実装する中間クラス ( ) を実装します。

class InterFoo : AFoo
{
    public override string Member { get; } 
}

次に、クラスにその中間クラスを継承させ、基本クラスのバージョンをシャドウさせます。

class Foo : InterFoo
{
    public new int Member { get; }
}

それはうまくいくはずです。

于 2020-03-09T14:37:15.953 に答える