仮想メソッドのオーバーライドからベースメソッドへの呼び出しを奨励または阻止するためのC#属性またはコード検査コメント

マイケルライアン

Unity with RiderでC#プロジェクトに取り組んでいます。

空の仮想メソッドを持つ基本クラスと、そのメソッドをオーバーライドする派生クラスが表示されることがあります。base.MethodName()基本メソッドが空であっても、メソッドのオーバーライドには明示的な呼び出しがあります。

public class A
{
    public virtual void Method1() { }

    public virtual void Method2()
    {
        // Important logic performed here!
    }
}

public class B : A
{
    public override void Method1()
    {
        base.Method();

        // Do something else ...
    }

    public override void Method2()
    {
        // Do something here ...
    }
}

RiderのILViewerでメソッドを見ると、メソッドが空であっても、基本メソッドへの呼び出しが含まれています。

C#またはRiderに次のようなメソッド属性またはコード検査コメントはありますか?

  1. 空のベースメソッドを呼び出すときに、コンパイラまたはコード検査の警告を生成します。

  2. ないベースメソッドを呼び出さない場合、コンパイラまたはコード検査の警告を生成します。

例えば:

public class A
{
    [OmitCallFromOverride]
    public virtual void Method1() { }

    [RequireCallFromOverride]
    public virtual void Method2()
    {
        // Important logic performed here!
    }
}

複数の派生クラスがメソッドをオーバーライドし、1つ以上が誤って基本メソッドの呼び出しに失敗し、予期しない動作が発生する可能性があるシナリオを想像できます。または、空のbaseメソッドへの不要な呼び出しがあり、無駄になる可能性がありますが、何も壊す可能性が低い状況。

私は主にそのような属性やコード検査コメントが存在するかどうかを尋ねていますが、重要なロジックを基本仮想メソッドから除外するなど、常にオーバーライドから基本メソッドを呼び出すなど、人々がこれらの状況をどのように処理するかについても知りたいです。 、または基本メソッド呼び出しが不要か必須かを通信する他の方法を使用します。

ペドロペレス

空のベースメソッドを呼び出すときに、コンパイラまたはコード検査の警告を生成します。

C#では、私が知る限り、空のメソッドに対する警告はありません。したがって、空のベースメソッドを呼び出しても警告はないと思います
しかし、あなたはあなたのためにそれを自由に書くことができます:あなたの最初のアナライザーとコード修正を書いてください

空でないベースメソッドを呼び出さない場合は、コンパイラまたはコード検査の警告を生成します。

C#ではなく、派生クラスに基本メソッドを呼び出させるのは良い考えではないと思います。あなたのシナリオでは、すべての派生クラスのメソッドが常に基本メソッドを呼び出すとよいと理解できますが、それは非常にまれなケースです。そして一般的に、トリッキーな(直感的ではない)ルールが必要な場合、それは私たちの解決策があまり明確でないことを意味します。

重要なロジックを基本仮想メソッドから除外する

A.Method1呼び出す必要がある場合virtualメソッドとして呼び出すのは得策ではないかもしれませんvirtual派生クラスにそれを使用する機会を与えるか、より適合したバージョンで上書きする機会を与えたい場合メソッドがあります。
シナリオに適応できるソリューションを提案します。

abstract class A
{        
    public abstract void Method1();

    public virtual void Method2() { }

    public void MustBeCalled() 
    { 
        // Here you can put the logic you had in Method1, you need to execute this code, so this method can't be overwrited.             
    }

    public void TemplateMethod()
    {
        Method1();
        MustBeCalled();
        // Do something else ...
    }

}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ