2016-06-14 7 views
-1

나는 추상 클래스를 상속하는 여러 클래스가 있습니다. 모든 하위 클래스에 대해 일반적인 기본 클래스에서 하나의 메서드를 만들었습니다. 모든 자식 클래스가 강제로 해당 메서드를 호출하도록합니다. 그렇지 않으면 컴파일 오류가 표시되어야합니다.강제로 자식에서 기본 메서드를 호출하는 방법

어떻게하면됩니까?

+3

현재 코드를 표시 할 수 있습니까? – fubo

+2

코드 없이는 추측하기가 어렵지만 _ method_를 호출하는 컴파일러 오류는 생각할 수 없습니다. –

+2

언제 메소드를 호출해야합니까? 생성 중에 호출해야하는 경우 기본 클래스는 필요한 생성자 만 노출해야합니다. 그렇지 않으면, 모든 상속인이 구현해야하는 추상 (보호 된) 메소드를 호출하는 노출 된 메소드가 기본 클래스에있는 경우 로직을 반전시켜야합니다. –

답변

1

그냥 기본 클래스 생성자에서 호출하십시오.

  1. 에 만약 MandatoryMethod 요구 : 물론이의

    public abstract class Base 
    { 
        protected Base() 
        { 
         //.... 
         mandatoryMethod(); 
        } 
    
        private void mandatoryMethod() { ... } 
    
        public abstract Foo Frob(); 
    } 
    
    public class Derived: Base 
    { 
        public Derived(....) 
        { 
         //new Base() will have been called when execution reaches this point. 
        } 
    
        public override Foo Frob() { ... } 
    } 
    

    은 몇 가지 제한 사항이 있습니다 : 당신이 필수 방법은 항상 객체 생성시 호출된다는 보장되도록 모든 파생 된 개체 기본 클래스 생성자를 호출해야합니다 Derived의 생성자가 실행을 마친 후에 호출하면 작동하지 않습니다.

  2. 거의 정의되지 않은 "의무 호출"요구 사항이 Derived 메서드를 호출하기 전에 MandatoryMethod을 호출하는 것을 의미하면이 방법은 작동하지 않으며이를 강제 할 수는 없습니다. 모든 소비자의 코드를 소유하고 있지 않은 경우 요구 사항을 변경하면 코드 검토 만 수행 할 수 있습니다.

컴파일러의 역할은 법적 코드를 컴파일하고 불법 코드를 허용하는 것입니다. 주어진 에 정의 된 메서드가 Derived에서 호출되지 않는 것에 대해서는 불법이 아닙니다. 즉, 언어 요구 사항이 아닌 응용 프로그램의 논리 요구 사항입니다. 컴파일러에서이를 강제 할 수는 없습니다. 가장 가까운 것은 생성자 솔루션을 사용하는 것입니다. 여기에서 컴파일러는 객체를 생성 할 때 항상 MandatoryMethod이 항상 호출되도록 보장합니다.

+0

'abstract' 클래스의 인스턴스 생성자 ('public Base()')는 public이 아니어야합니다. 어디에서나 새로운 Base()를 말할 수 없기 때문에 어디서나 public class를 만드는 것은 혼란 스럽습니다. 생성자를 사용하는 유일한 방법은 클래스를 파생시키는 것으로 연결하는 것입니다. 따라서이 경우에는'protected Base()'를 사용하는 것이 일반적입니다. –

+0

@JeppeStigNielsen 매우 사실! 고쳐 주셔서 감사합니다 – InBetween

+0

고맙습니다 .. 생성자 솔루션이 도움이되었습니다 .. –

관련 문제