2012-04-05 17 views
1

部分クラスの既存のメソッドをオーバーライドする方法はありますか?このようなコード生成の問題、既存のメソッド実装のオーバーライド

何か(私はこれはコンパイルされません知っている)

/// <summary> 
/// Generated Code for MyClass 
/// </summary> 
public partial class MyClass 
{ 
    public void MyMethod() 
    { 
     //Do work specific to MyClass 
    } 
} 

/// <summary> 
/// Non-generated extension for MyClass 
/// </summary> 
public partial class MyClass 
{ 
    public override void MyMethod() 
    { 
     //Do some other work 
    } 
} 

いくつかのコード生成をしながら、私はこのようなニーズに実行しています。私はEDMXから部分クラスを生成しています。これらのクラスのメソッドは、クラスの90%がそのプロパティに固有のメソッドを持つクラスです。

しかし、私は一度だけ方法を欲しいと思っているケースに遭遇しています。

私は見落としていますか?あるいは、いくつかの代替案がありますか?

答えて

1

これには部分的な方法を使用できます。シグネチャなどを変更する必要がある場合は、ここで補外することができます。

部分的なメソッドを定義し、そのクラスの別の部分ビットで実装を定義する人は誰もいませんノーオペレーションで、エラーではないので、問題を引き起こすことについて心配する必要はありません。文字通り、このユースケースのために作られました。

/// <summary> 
/// Generated Code for MyClass 
/// </summary> 
public partial class MyClass 
{ 
    private partial void MyMethodImpl(); 
    public void MyMethod() 
    { 
     //Do work specific to MyClass 

     MyMethodImpl(); 
    } 
} 

/// <summary> 
/// Non-generated extension for MyClass 
/// </summary> 
public partial class MyClass 
{ 
    public void MyMethodImpl() 
    { 
     //Do some other work 
    } 
} 
+0

非常に便利です! 'MyMethodImpl();'の前にコードを実行したくない時代のアイデアは何ですか? – Khan

+0

いつ実行したくないですか? MyMethodImplが定義されている場合、MyMethodをスキップしますか? MyMethodImplは、ドキュメントで "自動生成されたコードを実行する"と定義されているブール値を返すことができます。 – Servy

+0

実際には部分的なメソッドはvoidでなければならないので、インスタンスのboolean変数を設定するか、outパラメータを使用する必要があります。 – Servy

0

なぜ生成されたクラスから派生し、派生クラスのメソッドをオーバーライドしていませんか?

+0

脆弱な基本クラスの問題が発生する可能性があります。自動生成されたクラスはかなり変化する傾向があり、派生クラスの機能を破壊していないことを確認するために、すべての変更を調べる人はいません。 – Servy

+0

私は、部分的な方法などの他の技術的な織り方がこの問題を解決するのに役立つとは確信していません。手動コードとコードジェネレータが時間の経過とともに変化している場合は、人間が行動を起こしているかどうかを知る必要があります。私たちは、この問題に対してdouble-derivedというパターンを使用します。 – GarethJ

1

フラグベースの拡張ポイントを使用して、コードベースで広範囲に二重派生パターンを使用します。 http://msdn.microsoft.com/en-us/library/bb126289(v=vs.100).aspx

生成されたコードは次のようになります。

public abstract class FooBase 
{ 
    protected FooBase() 
    { 
    } 
    public virtual int GetSomeThing() 
    { 
     // ... some generated implementation ... 
    } 
} 

public partial class Foo 
{ 
    public Foo() : FooBase() 
    { 
    } 
    // Nothing except the constructor generated in this class. 
} 

私たちは、その後、時折生成されている方法は用のスタブ実装を提供する大規模なコメントで、コンパイルしていないメソッドを生成することによって、手動でコードのための彼らの必要性にフラグを付けます必要な手動コード。それはかなり成功しています。

関連する問題