2016-12-14 23 views
0

私はクラスParentを持ち、Parentを継承する別のクラスChildを持っています。オペレータオーバーロードのメソッドをオーバーライドする

私は親の中に演算子オーバーロードメソッドを持っています。私はそれもChildでも動作させたいと思います。しかし、私はこれを行う方法がわかりません。

public class Parent 
{ 
    public int age; 
    public static Parent operator + (Parent a, Parent b) 
    { 
    Parent c = new Parent(); 
    c.age = a.age + b.age; 
    return c; 
    } 
} 

public class Child : Parent 
{ 
    //other fields... 
} 

私が考えることができる唯一の方法は、全く同じ方法とロジックを子供にコピーすることです。しかし、私は、コードが冗長であるので、それは良い方法ではないと考えている。(コードが非常に長い場合は特に)

public class Child : Parent 
{ 
    public static Child operator + (Child a, Child b) 
    { 
    Child c = new Child(); 
    c.age = a.age + b.age; 
    return c; 
    } 
} 

私はキャスト実行しようとしましたが、それは実行時に失敗します。

public class Child : Parent 
{ 
    public static Child operator + (Child a, Child b) 
    { 
    return (Child)((Parent)a + (Parent)b); 
    } 
} 

がありますこれを達成するより良い方法は?どうもありがとうございました。

+0

を呼び出して、あなたが「親A =新しい子供のような子クラスのオブジェクトを開始するために、親のタイプを使用してみましたことを、保護コンストラクタにロジックを移動するだろう(); " –

+0

私はParentを使って起動しても、どのように(Parent + Parent)をChildに変換するのですか? – user3545752

+0

サイドノート:この問題に直面すると、誰も親子から期待することを誰も理解できなくなり、コードを読み取ることができなくなる可能性があります。この時点で、ビルダーメソッドや別のものに行く方が良い選択肢かもしれません。 –

答えて

1

最終的にChildオブジェクトを作成する必要がありますが、ロジックを保護されたメソッドに移すことができます。

public class Parent 
{ 
    public int age; 
    public static Parent operator + (Parent a, Parent b) 
    { 
    Parent c = new Parent(); 
    AddImplementation(a, b, c); 
    return c; 
    } 

    protected static void AddImplementation(Parent a, Parent b, Parent sum) 
    { 
    sum.age = a.age + b.age; 
    } 
} 

public class Child : Parent 
{ 
    public static Child operator + (Child a, Child b) 
    { 
    Child c = new Child(); 
    AddImplementation(a, b, c); 
    return c; 
    } 
} 

それとも別のオプションは、オペレータが

public class Parent 
{ 
    public int age; 
    public static Parent operator +(Parent a, Parent b) 
    { 
     return new Parent(a, b); 
    } 

    protected Parent(Parent a, Parent b) 
    { 
     this.age = a.age + b.age; 
    } 
} 

public class Child : Parent 
{ 
    public static Child operator +(Child a, Child b) 
    { 
     return new Child(a, b); 
    } 

    protected Child(Child a, Child b) : base(a,b) 
    { 
     // anything you need to do for adding children on top of the parent code. 
    } 
} 
関連する問題