2017-01-10 3 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

특성은 메서드, 클래스 또는 속성에 사용되는 선언적 클래스라고 일컬어지는 것을 유의하십시오. 속성 대신 속성 또는 멤버 일 가능성이 있습니다. 이에 따라 귀하의 질문이 업데이트되므로 오해의 소지가 없습니다. 또한 어머니와 자녀라는 용어는 상속에 사용되는 용어가 아닙니다. 유형간에 관계가있을 때 parent/child를 사용합니다. 상속은 수퍼 클래스와 서브 클래스를 다룹니다. – Michael

+0

나는 당신이 무엇을 요구하고 있는지 이해하지 못합니다. 당신이하려는 일에 대해 더 자세하게 설명해야합니다. 당신은 나쁜 습관을 보여주지 않았고 어떤 구체적인 방법으로 고치려고하는지 지적하지 않았습니다. 독점 코드를 난독 화하려고하는 것을 이해하지만, 과일, 차량 등으로 예제를 만들어야합니다. 그래서 당신이 해결하려고하는 상속 문제가 어떤 것인지 이해할 수 있습니다. – krillgar

답변

1

, 당신은 계승되고있는 humungous 한 클래스가 다른 많은 계급에 의해.

거대한 클래스를 다루고 상속과 결합하는 가장 좋은 방법은 그것을 피하는 것입니다.

너무 많은 기능을 사용하는 경우 기본 클래스를 수정해야 할 경우이 두 가지 경우에 많은 문제가 발생할 것입니다. 기본 클래스를 수정하면 모든 파생 클래스에 영향을 미치므로 추적 및 테스트하기가 어려울 수 있습니다. 공유 변수와 함께 사용하면 기본 클래스가이를 업데이트했는지 또는 파생 클래스가이를 업데이트했는지 알 수 없습니다.

밀접하게 관련된 기능을 위해 기본 클래스를 더 작은 클래스로 나누는 것이 좋습니다. 상속 이상의 구성을 선호합니다. 이렇게하면 회원/변수 공유가 줄어들고 관리 가능한 코드가 생깁니다.

+1

[관심 사항 분리 또는 단일 책임 원칙] (https://weblogs.asp.net/arturtrosin/separation- of-concern-vs-single-responsibility-principle-soc-vs-srp) – Michael

+0

@Michael이 링크에 감사드립니다. 나는 솔리드 원칙을 거치기 위해 OP를 제안합니다. 코드 리팩터링을 통해 안내 할 것입니다. – CarbineCoder