2017-01-10 8 views
0

この属性共有を行う基本的な方法(パラメータごとの属性渡し)とインターフェイス(これまでのところ、私はメインクラスをリファクタリングしており、これをやり直すことをやめようとしているので、これを行うには他の方法があるかどうか、おそらくさらに良いことを知りたいと思っています。複数のクラスが同じ属性をC#で共有するのに最適な方法

問題は次のとおりですが、私はいくつかの子供を持つ母親のクラスを持っていますが、会社の必要に応じて他の子供が作成され、子供のいくつかのメソッドが母親に渡され、 15の属性と、より完全なクラスに分けることのできる60のメソッドがあります。

私のクラスは、私は誇りに思っていないよ、これらの混乱したモンスターをしているので、彼女はリファクタリングの上に泣いている理由あなたが理解する必要があります。その様子から

public class A 
{ 
    protected Form myForm = new Form(); 
    protected WebBrowser myBrowser = new WebBrowser(); 

    protected List<ComplexType1> List1 = new List<ComplexType1>(); 
    protected List<ComplexType2> List2 = new List<ComplexType2>(); 
    protected List<ComplexType3> List3 = new List<ComplexType3>(); 
    protected List<ComplexType4> List4 = new List<ComplexType4>(); 

    protected ComplexType5 myData; 
    // And more attribute ... 

    public A() { } 
    protected virtual void Method1() {} 
    protected virtual void Method2() {} 
    protected virtual void Method3() {} 
    protected virtual void Method4() {} 
    protected virtual void Method5() {} 

    // And more and more methods ... 
} 

public class B : A 
{ 
    protected ComplexType6 anotherData; 

    public B() : base() {} 
    protected override void Method3() {} 
    protected override void Method4() {} 
    protected virtual void Method6() {} 
} 

public class C : A 
{  
    public C() : base() {} 
    protected override void Method1() {} 
    protected virtual void Method6() {} 
    protected virtual void Method7() {} 
} 

// And more and more child classes ... 
+4

'B'と' C'のコンストラクタの戻り値の型をvoidで指定することはできません。 –

+4

属性は、メソッド、クラス、またはプロパティに対して使用される宣言的クラスと呼ばれるのが一般的です。おそらく、属性の代わりにプロパティまたはメンバであることを意味します。私はそれに応じてあなたの質問を更新するので、誤解されていません。また、母親と子という用語は、継承に使用される用語ではありません。タイプ間の関係がある場合は、親/子を使用します。継承はスーパークラスとサブクラスを扱います。 – Michael

+0

あなたが何を求めているのか分かりません。あなたは、あなたがしようとしていることのより詳細な情報を提供する必要があります。あなたは悪い習慣であることを何も示しておらず、具体的な方法で修正しようとしていることを指摘していません。私は独自のコードを難読化することを理解していますが、あなたが解決しようとしている継承の問題の種類を理解するために、果物や車両などの例を考え出す必要があります。 – krillgar

答えて

1

、あなたは継承されているhumungousクラスを持っています他の多くのクラスによって。

巨大なクラスに取り組み、継承と結合する最良の方法は、それを避けることです。

あまりにも多くの機能を備えていて、それを修正するためにバインドされている基底クラスの場合、両方のケースで多くの問題が発生します。基本クラスを変更すると、派生したすべてのクラスに影響が及ぶため、追跡してテストするのは難しくなります。共有変数と組み合わせると、基本クラスがそれを更新したのか、派生クラスがそれを更新したのか分かりません。

密接に関連する機能のために、基本クラスを小さなクラスに分割することをお勧めします。継承以上の構成を優先する。これにより、メンバー/変数の共有が削減され、管理可能なコードが作成されます。

+1

[懸念の分離]単一責任の原則 - soc-vs-srp) – Michael

+0

@Michaelはリンクに感謝します。私はOPがSOLIDの原則を踏襲することをお勧めします。それはあなたのコードをリファクタリングすることによってあなたを導くでしょう。 – CarbineCoder

関連する問題