1

他のクラスのベースとなるクラスがあります。クラスには、派生クラスでオーバーライドされることになっている仮想メソッドがあります。定義方法は次のとおりです。

protected virtual TableFormat GetFormat()
{
    throw new NotImplementedException("Implement the format generator in derived class.");
}

これは良い習慣ですか?NotImplementedException上司は、それは自動生成コードにのみ使用するべきだと言っていますが、彼がその理由を説明するまで、私はそれに従うことを拒否します.

また、これは、非抽象クラスに抽象メソッドを配置するのに適しているようです。これが許可されないのはなぜですか?

4

3 に答える 3

3

これは良い習慣ですか?:

IMO、NotImplementedException他に何を返すかをスローする方が良いです。 を返すnullと、クラスのユーザーはこのメソッドをオーバーライドする必要があることを決して知りません。だから私はあなたの上司に同意しません。

これは、非抽象クラスに抽象メソッドを配置するのに適した場所のようです。これが許可されないのはなぜですか?

ディスカッションが表示される場合があります:非抽象クラスの抽象メソッド

他のクラスのベースとなるクラスがあります。クラスには、派生クラスでオーバーライドされることになっている仮想メソッドがあります。

abstractメソッドを仮想の代わりに定義してみませんか。

メソッドまたはプロパティの宣言で抽象修飾子を使用して、メソッドまたはプロパティに実装が含まれていないことを示します。

しかし

  • 抽象メソッドは暗黙的に仮想メソッドです。
  • 抽象メソッドの宣言は、抽象クラスでのみ許可されています
  • 抽象メソッド宣言は実際の実装を提供しないため、メソッド本体はありません。メソッド宣言は単にセミコロンで終了し 、署名の後に
    中括弧 ({ }) はありません。
于 2013-03-28T11:45:58.697 に答える
1

メソッドをこのクラスの実装としてマークabstractすると、本体を定義する必要があります。クラスも同様にマークする必要がありabstractます。

public abstract class MyClass 
{
    protected abstract TableFormat GetFormat();
}
于 2013-03-28T11:46:43.143 に答える
0

このようなメソッドは、そのメソッドのオーバーライドを強制する有効な方法です。これは許されるべきだと思いますが、あなたの上司は私に同意しないかもしれません。

実際、クラスがインスタンス化されてもメソッドが呼び出されない場合、この方法は抽象クラスを作成するよりも優れています。また、そのようなメソッドで厳密な型チェックを試みることもできます。これにより、現在のインスタンスが正確にこのクラスであり、サブクラスではない場合 (もちろん可能であれば)、例外はスローされません。

于 2013-03-28T11:49:01.167 に答える