2011-07-07 13 views
0

これは初心者の質問になる可能性があるので簡単ではありませんが、とにかくそれを行います。私はJavaScriptのバックグラウンドから来ているので、C#(および他のOOP言語)にこの問題を解決するための何かが組み込まれているかどうかは分かりません。C#クラスに補助機能を追加する/委任する方法

&具体的なクラスを分割して再利用できるように委任された実装を使用して、私のクラスに補助機能を追加したいと思います。

以下の実装では、私が変更できない外部APIから "LibraryClass"を使用しています。私はそれを拡張することによってそれを使用する "MyClass"を書いています。

public class LibraryClass {...} 

public class MyClass : LibraryClass {...} 

ここでは、ページングなどの機能性を追加したいと考えています。そこで、私は "LibraryClass"を拡張する新しいクラス "Paging"を&拡張 "MyClass"から作成しました。

現在の実装

public class LibraryClass {...} 

public class Paging : LibraryClass { 
    protected int pageNumber = 1; 

    public void setPaging(TRequest request) { 
     var httpReq = this.RequestContext.Get<IHttpRequest>(); 
     pageNumber = httpReq.QueryString["page"]; // parsing syntax skipped 
    } 
} 
public class MyClass : Paging { 
    public override object OnGet(Products request) { 
     setPaging(request); 
     return new ProductsResponse { Products = GetAll() }; 
    } 

    private List<Product> GetAll() { 
     // Use base.pageNumber to pull appropriate data 
    } 
} 

が、これはインタフェースを備えた、よりきれいな方法または任意の他のC#のメカニズムであることはできますか?

案実装

public class LibraryClass {...} 
public interface IPaging : LibraryClass { 
    void setPaging(TRequest request) 
} 
public interface Paging : IPaging { 
    public void setPaging(TRequest request) { 
     var httpReq = this.RequestContext.Get<IHttpRequest>(); 
     pageNumber = httpReq.QueryString["page"]; // parsing syntax skipped 
    }   
} 
public class MyClass : IPaging {...} 

私はまた別のクラスへのアクセス&デリゲートの実装のようなMyClassのに多くの「具体的な」機能を追加したいです。

public interface IAuth {...} 
public class Auth : IAuth {...} 
public class MyClass : IPaging, IAuth {...} 

ここでのキーはコードの区切りです。

私は学校でいくつかの基本的なOOPクラスを見逃していたかもしれませんが、遅くとも私が推測するツールはありません。

+1

委任パターン:http://en.wikipedia.org/wiki/Delegation_pattern ...わからない、ただ思い。 – IAbstract

+0

LibraryClassはフレームワークの一部です&私はそれを推測するので、私はそれの選択された機能を凌駕していますか? – SamJackSon

答えて

0

LibraryClassのすべての機能が必要ない場合は、wrapperを作成してください。 Encapsulateそれをクラスに入れ、あなたが望むものだけを公開します。

public class LibraryClassWrapper 
{ 
    private LibraryClass _libraryClass = new LibraryClass(); 
    public void MyFoo() 
    { 
     // do something... then call a method in the LibraryClass (if required) 
     _libraryClass.Foo(); 
    } 
} 

あなたはその後、他のインタフェースで他のfunctionalitesを分離し、それらからあなたMyClassオブジェクトを継承することができます。

public interface IAuth {...} 
public interface IPaging {...} 
public class MyClass : LibraryClassWrapper, IPaging, IAuth {...} 

インターフェイスの具体的なクラスを継承することはできません。 C#は複数のインタフェース継承しかサポートしていません。クラスは、1つの具象クラスと複数のインタフェースから継承することができます。

+0

この場合、IPaging&IAuthの定義はどこに書くのですか? MyClasでは?私は今分けたいと思っています。 – SamJackSon

+0

_definitions_は別の場所に置くことができます。あなたは_implementations_を参照していますか? –

1

あなたが探していることは、オブジェクトの組成物である場合、私はいくつかのオブジェクトが特定の機能を持つ小さなオブジェクトで構成されているような、不思議 - http://en.wikipedia.org/wiki/Object_composition

を参照してくださいそして、依存性注入を使用して、このシンプルになります。Which .NET Dependency Injection frameworks are worth looking into?

もっと読み

+0

Dependency Injectionが組み込まれたServiceStackを使用していますが、それを確認してください。 – SamJackSon

+0

うん、それは、Funq IOCコンテナを内蔵しています。 – SamJackSon

関連する問題