2009-09-23 2 views
1

나는 유사점과 차이점을 가진 클래스 집합을 가지고 있습니다. 이 클래스는이 서로 다른 클래스 간의 고유 한 동작을 정의하는 인터페이스와 여러 클래스의 공통 기능을 호출하는 기본 클래스에서 파생됩니다.동일한 동작 + 고유 한 동작을 가진 코드 클래스

이러한 종류의 클래스가 생성되는 방식을 제어하는 ​​디자인 패턴이 있습니까? 이 설계 챌린지를 위해 기본 클래스와 인터페이스를 함께 사용할 수 있습니까 (여러 클래스가 모두 동일한 논리 + 고유 동작을 가짐).

감사합니다.

+0

클래스는 여러 인터페이스를 구현할 수 있습니다. 인터페이스 분리 원칙 - http://davidhayden.com/blog/dave/archive/2005/06/15/1482.aspx – TrueWill

+0

참으로. 이것은 알고 있지만 기본 클래스를 사용하면 논리가 이미 정의되어 소비 될 수 있으며 인터페이스 소비자에게 정의되지 않습니다. 그런 다음 기본 클래스를 봉인 할 수 있습니다 (아마도 인터페이스로이 작업을 수행 할 수도 있고 기억할 수도 없습니다). – dotnetdev

답변

0

공통 인터페이스에 기본 클래스를 사용하지 않고 공통적 인 동작 만 사용하는 경우에는 기본 클래스를 파생시킬 필요가 없으며 대신 멤버로 만듭니다. 그렇게하면 필요에 따라 동작을 동적으로 할당 할 수 있습니다.

public class behavior 
{ 
    private void Login(); 
} 

public class concrete1: behavior, IWebApplication 
{ 
    public void Dosomething {Login; ... } 
} 

는 행동의 구현 만 변경하려는 경우

public class behavior 
{ 
    public void Login(); 
} 

public class concrete: IWebApplication 
{ 
    private mBehavior; 
    public concrete(behavior aBehavior): mBehavior(aBehavior) {if (aBhavior == 0) mBehavior = new behavior} ; 

    public void Dosomething {mBehavior.Login; ... } 
} 

지금 당신이 행동에서 파생된다.

+0

일반적인 기능을위한 정적 클래스는 어떻습니까? 기본 클래스에 비해 이점을 제공 할 수있는 것은 무엇입니까? – dotnetdev

+0

귀하의 접근 방식을 사용하도록 코드를 수정할 수 있습니다. mbehaviour는 보이는 정적 클래스 변수입니까? – dotnetdev

+0

비헤이비어가 상태를 저장하지 않는 경우 비헤이비어 및/또는 비헤이비어를 정적으로 만들 수 있지만 일반적으로 비헤이비어가 수행 한 다음 모든 콘크리트 객체에 대해 인스턴스화해야합니다. – Ozan

1

그것은 당신의 인터페이스를 제공하고 있습니다 어떤 이점이 나에게 분명하지 않다. 비슷한 행동과 다른 행동을하는 클래스를 갖는 것은 상속의 본질입니다. 모든 공통적 인 동작을 기본 클래스에 넣을 수 있으며 각 하위 클래스에서 다르게해야하는 장소를 재정의 할 수 있습니다.

당신의 언어가 추상 기본 클래스를 지원하지 않는다면, 기본 클래스와 인터페이스를 갖는 것이 합리적이라고 생각합니다. 당신이하려는 일의 예를 들려 줄 수 있습니까?


뭔가처럼 ABC가 될 수 있습니다

public abstract class A 
{ 
    public virtual void EverybodyDoesThisTheSame(); 
    public abstract void ThisIsDifferentForEach(); 
} 

그런 다음, 파생 클래스에서, 당신은 단지) ThisIsDifferentForEach을 (inplement해야하고, 그들은 모두() EverybodyDoesThisTheSame의 상속 된 버전을 사용할 수 있습니다.

+0

저는 C#을 사용하고 있습니다. 그래서 나는 추상적 인 클래스 지원을 가지고 있습니다. 필자의 경우 다른 웹 응용 프로그램에 로그인해야합니다. 로그인 프로세스는 이러한 여러 응용 프로그램에서 동일하며 인터페이스 소비자 (IWebApplication)에서 호출하는 기본 클래스로 모델링했으며 유효성 검사 메소드가 포함 된 인터페이스를 만들었습니다. 오류가 발생하지 않았습니다. (다른 인터페이스 소비자에서 다르게 작동 함). – dotnetdev

+0

사용자 정의 동작을 위해 기본 클래스를 재정의 할 필요가 없습니다. 인터페이스 소비자는 사용자 정의 동작 (인터페이스 소비자마다 완전히 다른)을 정의합니다. 일반적인 기능과 고유 한 기능은 별도의 비즈니스 프로세스이므로 별도의 메서드 인 – dotnetdev

+0

을 사용하여 추상적 인 기본 클래스 아이디어를 확장하는 내 대답을 편집했습니다. 솔직히, 그것은 맛의 문제입니다. 나는 보통 인터페이스가 "이 객체들은 단지이 동작을 공유하지만 그렇지 않으면 관련이 없다"에 적합하다고 생각합니다.많은 양의 기능이 동일한 경우에는 추상적 인 기본 클래스를 선호합니다. –

관련 문제