2009-08-06 10 views
6

我々は2つのクラスを持っているが「親」と「子」を言う:強制子クラスのメソッドが呼び出されたときに、親クラスのメソッドを呼び出すために - 下記のようにC#.NE

class Parent 
{ 
    parent_AddUser() 
    { 
     // add user code for parent 
    } 

    abstract child_AddUser(); 
} 

// child class 
class Child : Parent 
{ 
    child_AddUser()  // implementing the abstract method 
    { 
    // child addUser code 
    } 
} 

我々がいるかどうか知りたいのですが明示的な呼び出しを行うことなくchild_addUser()が呼び出されるたびに、parent_AddUser()メソッドを強制的に呼び出すことができます。

+0

はあなたのジョンと私たちのクエリに応答しようとした他のすべてに感謝します。本当に役に立ちます。ありがとう。 –

答えて

1

いいえ、これを行う方法はありません。 child_AddUserのparent_AddUserへの呼び出しを追加する必要があります。


テンプレートメソッドパターンを使用すると、同様のことができます。

public abstract class Parent { 
    public void AddUser(User user) { 
     // Do parent stuff 
     AddUserImpl(user); 
     // More parent stuff 
    } 

    protected abstract void AddUserImpl(User user); 
} 

public class Child { 
    protected override void AddUserImpl(User user) 
    { 
     // Do child stuff 
    } 
} 
1

私が知る限り、これは不可能です。しかし、あなたができることはTemplate Method patternを使うことです。

0

仕事で、これはこの

class Parent { parent_AddUser() { // add user code for parent 

} 

protected virtual child_AddUser(){ 
//does smethins 
} 
} 


class Child: Parent 
{ 
protected override child_AddUser() 
{ 
// does something 
base.child_AddUser(); 
} 
} 
9

ようarroundのようにはい、それがこれを行う方法は、代わりにtemplate method patternを使用することであることも可能である:

public abstract class Parent 
{ 
    public void AddUser() 
    { 
     // Preparation goes here 
     AddUserImpl(); 
     // Clean-up goes here 
    } 

    protected abstract void AddUserImpl(); 
} 

public class Child 
{ 
    protected override void AddUserImpl() 
    { 
     // Do stuff here 
    } 
} 

その方法Parent通話以外の無1 AddUserImpl - 呼び出し元はAddUserを使用します。これは、正しいビットのための具体的なサブクラスに委譲します。

0

あなたはchild_Adduserは非公開にし、全体のアドオンユーザーのアクションを制御する第3の方法を追加する必要があります。Adduser()が常に呼ばれる親と子の両方の部分が実行される

class Parent 
{ 
    private void parent_Adduser() 
    { 
     // ... 
    } 

    protected abstract void child_Adduser(); 

    public void Adduser() 
    { 
     parent_Adduser(); 
     child_Adduser(); 
    } 
} 

class Child 
{ 
    protected override void child_Adduser() 
    { 
     // ... 
    } 
} 

この方法で、。

0

あなたが何かのように、子クラスにロジックを強制する場合:次に

class Parent 
{ 
    public void AddUser() 
    { 
     // pre-logic here 
     AddUserCore(); 
     // post-logic here 
    } 

    protected abstract void AddUserCore(); 
} 

// child class 
class Child : Parent 
{ 
    protected override void AddUserCore() 
    { 
    // child addUser code 
    } 
} 

親メソッドを呼び出す必要はありません。すでにあなたが好きな何かができる

+0

子クラスで初期化された変数が必要な場合、これはうまくいきません。 – tsells

0

を「事前の論理」で行われ、「ポスト・ロジック」:

class Parent 
{ 
    parent_AddUser() 
    {  // add user code for parent }  

    public child_AddUser() 
    { 
     this.parent_AddUser(); 
     this.doChildAddUser(); 
    } 

    protected abstract doChildAddUser(); 
} 

// child class 
class Child : Parent 
{ 
    doChildAddUser()  // implementing the abstract method 
    {  // child addUser code  } 
} 
関連する問題