2011-02-01 2 views
10

추상 메서드로 추상 클래스를 작성하고 있습니다 (따라서 모든 클래스가이 메서드를 구현해야합니다). 그러나 각 메서드는 서로 다른 매개 변수를 사용하거나 매개 변수를 사용할 수 없으므로 메서드에서 사용해야하는 매개 변수를 지정하고 싶지 않습니다. 이름과 반환 값만 같아야합니다.매개 변수를 지정하지 않고 추상 메서드를 정의하십시오.

C#에서이 작업을 수행 할 수있는 방법이 있습니까?

도움 주셔서 감사합니다.

답변

16

아니요, 그렇게하는 것이 의미가 없습니다. 매개 변수를 선언하지 않으면 기본 클래스에 대한 참조 만 주어진 메서드를 호출 할 수 없습니다. 이것이 추상 메소드의 요점입니다. 호출자가 구체적인 구현을 신경 쓰지 않고 사용할 API를 제공 할 수있게하는 것입니다.

발신자가 정확한 메소드 서명을 알아야하는 경우 해당 호출자를 구체적인 구현에 연결하여 추상화를 근본적으로 쓸모 없게 만듭니다.

아마도 자세한 내용을 제공 할 수 있다면 더 적절한 방법을 제안 할 수 있을까요?

public class Foo<T> 
{ 
    public abstract void Bar(T t); 
} 

콘크리트 하위 유형 중 하나 일반, 또는 예를 들어 Foo<string>에서 파생 수 있습니다 : 예를 들어, 일반적인 유형을 만들 수 있습니다.

+0

각 자식은 다른 유형의 입력을 사용할 수 있지만 동일한 유형의 출력을 생성하는이 방법의 구현을 만들어야합니다. 따라서 출력을 사용하여 프로그램의 논리를 수행 할 수 있습니다. – TheBoss

+2

@TheBoss : 추상 클래스 (인터페이스와 같은)의 요점은 일반적인 기능의 ... 잘 .. 추상화를 허용하는 것입니다. 당신은 "* Foo"라는 함수를 필요로하고 * 매개 변수를 취하고'int'를 반환하는 것과 같은 것을 정의 할 수는 없다. 그러한 함수는 그 서명이 정의되어 있지 않기 때문에 추상화 될 수 없다. 특정 서명이 정의 된 것보다 높은 수준에서 클래스를 참조하는 코드에서 (비 반영적으로) 호출하여 추상화를 깨는 것은 불가능합니다. –

+0

@ TheBoss : Jon이 게시 한 코드 예제와 같이 Generics를 사용하여 디자인 과제를 해결하는 방법을 찾아야한다고 생각합니다. – code4life

0

아니요, 없습니다.

메서드를 재정의하려면 메서드 서명을 일치시켜야합니다. 여기에는 메소드 이름과 형식 매개 변수가 포함됩니다.

1

당신이하려는 것은 코드 냄새입니다.

더 좋은 패턴은 추상적 클래스가 ISupportInitialize을 구현 한 다음 초록 Act() 메소드를 구현하는 것입니다.

BeginInitEndInit 사이의 호출에서 자녀 유형이 행동 준비를 할 때 정보의 다양한 비트를 모으므로 무작위 유형 및 개수의 인수를 채우려 고합니다. 일단 구성되고 EndInit이 호출되면 (여기에서 유효성을 검사하면) 요약 Act()을 호출 할 수 있습니다.

또한

,이 작업을 수행하지 마십시오하십시오 : 당신이 뭔가를 할 경우

public abstract void Act(params object[] arguments); 

사람들은 아래를 사냥합니다.

+0

그것은 흥미로운 접근 방법입니다. 그래서 클래스의 부울 필드는 초기화가 완료되었을 때 나타낼 것이며, 그 다음에 만 Act() 메소드가 성공적으로 실행하면 그렇지 않으면 예외가 발생합니다. – TheBoss

+0

@TheBoss 표준 기술은 EndInit에서 인스턴스의 상태를 확인하고 올바른 상태가 아닌 경우 throw합니다. 이 인터페이스를 구현하는 형식은 종종 EndInit 호출 후 자신을 변경할 수 없게 만듭니다. – Will

관련 문제