2011-07-03 4 views
0

1) OnCreate는 ClsLast 클래스의 인스턴스화 된 객체의 public 메서드입니다. 그러나 OnCreate 메서드를 보호 된으로 제한하려고했습니다. Illegal modifier for the interface method OnCreate; only public & abstract are permitted객체 지향 인터페이스, 추상 클래스 및 콘크리트 클래스에 대한 질문

3) 나는 보호 설정 한 경우 :

interface InterFace { 
    protected void OnCreate(); 
} 

내가지고있어 오류가이 같은 인터페이스에서 보호 나는이 방법을 한 OnCreate 설정하면

interface InterFace { 
    void OnCreate(); 
} 

class ClsFirst implements InterFace { 
    @Override 
    public void OnCreate() { } 

} 

class ClsLast extends ClsFirst{ } 

class Test { 
    static void main(){ 
     ClsLast objClsAct = new ClsLast(); 
     objClsAct.OnCreate(); 
    } 
} 

2) 메서드는 다음과 같이 InterFace를 구현하는 ClsFirst 클래스 내에 있습니다.

Cannot reduce the visibility of the inherited method from InterFace

4) 나는 추상 클래스로 ClsFirst을 변경하고 구현하는 인터페이스로 나는 안에 방법을 한 OnCreate 구현하지 않은

interface InterFace { 
    void OnCreate(); 
} 

abstract class ClsFirst implements InterFace { 

} 

:

interface InterFace { 
    void OnCreate(); 
} 

class ClsFirst implements InterFace { 
    @Override 
    protected void OnCreate() { } 

} 

이 오류를 받고 있어요 ClsFirst 클래스이지만 ClsLast 이유는 무엇입니까?

요약 내가 인터페이스 방법을 설정할 수 있습니다 만 파생 클래스에서 사용할 수있는 방법

  1. ?
  2. Interface 내에서 보호 된 액세스로 메소드를 설정할 수없는 이유는 무엇입니까?
  3. 왜 InterFace를 구현 한 후에 클래스의 접근 자 유형을 public과 다르게 설정할 수 있습니까?
  4. 추상 클래스는 인터페이스를 구현하더라도 추상화 된 클래스를 파생시킬 때까지 구현되지 않은 메서드 자체를 추가 할 필요가없는 추상 클래스입니다. 왜?

지금부터 친절한 답변을 해주셔서 감사합니다.

+0

인터페이스를 구현하는 것이 어떤 상황이라고 생각하지만 파생 클래스에만 액세스를 제한하는 것이 합리적인지 설명 할 수 있습니까? 파생 클래스 만 메소드를 볼 수 있다면 인터페이스가 필요한 이유는 무엇입니까? – dtb

+0

클래스 구조 만들기의 초기 단계부터 인터페이스를 만들고 규칙을 작성하려고합니다. 그러나 이것을 시도하는 동안 나는 다른 질문에 직면했다. 당신의 대답으로 나와 나와 모든 사람들을위한 OOP에 대한 좋은 정보가있을 것이라고 생각했다. 그러나 나의 첫 번째 욕망은 규칙을 작성하고 인터페이스와 추상 클래스를 사용하여 훌륭한 클래스 구조를 만드는 것이다. – uzay95

+0

OOP의 한 가지 점은 개발자가 적합하다고 생각하는 클래스의 비공개 부분을 자유롭게 디자인 할 수 있다는 것입니다.클래스 구조의 공용 부분에만 규칙을 넣을 수 있습니다. – dtb

답변

2

interface은 정의 당 public contract입니다. 인터페이스를 구현함으로써 일련의 메소드 (및 다른 언어의 속성)를 제공 할 것을 약속합니다.

하나의 클래스에 원하는만큼 많은 인터페이스를 구현할 수 있고 derive 대신 implement을 사용할 수 있기 때문에 인터페이스에는 abstract 클래스와 공통점이 없습니다.

abstract class은 기본 클래스입니다.이 클래스는 부분적으로 기능적으로 다른 클래스 간의 구현 세부 정보를 공유하는 데 사용되며 계약도 제공합니다. 그러나 그것은 파생 된 모든 클래스에 대한 내부 계약입니다. 대부분의 경우 추상 클래스는 공개 계약을 공유하는 대신 모든 파생 클래스를 공통 패턴으로 강제 적용하는 데 사용됩니다.

추상 클래스는 파생 클래스가 메서드를 구현하도록 (또는 virtual 키워드를 사용하여 적절한 기본 구현을 제공) 강제로이 메서드 (이 경우는 Template Pattern)를 사용할 수 있습니다.

추상 클래스에 인터페이스를 구현하는 경우 추상 클래스를 인스턴스화 할 수 없기 때문에 모든 인터페이스 메소드를 제공 할 필요가 없습니다. 그러나 모든 인터페이스 메소드를 구현하지 않으면 첫 번째 비 추상 클래스가 누락 된 메소드를 제공해야합니다.

2

인터페이스 방법은 항상 공개입니다. 이러한 방법의 범위를 축소 할 수는 없습니다. 추상 클래스에서 대신 보호 된 추상 메서드를 사용하십시오.

0

사실 당신은 당신의 구체적인 클래스는 명시 적 인터페이스를 구현하여 "인터페이스"인스턴스에 주조 될 때까지, 방법을 숨길 수 :

abstract class ClsFirst : Interface 
{ 
    void Interface.OnCreate() 
    { 
      this.OnCreate(); 
    } 

    protected abstract void OnCreate(); 
} 

ClsFirst last = new ClsLast(); 
last.OnCreate(); // Compiler Error, since OnCreate() is protected 
Interface lastAsInterface = last; 
lastAsInterface.OnCreate(); // Works, and calls the abstract OnCreate() method. 
+0

java :'interface InterFace {void OnCreate(); } 추상 클래스 ClsFirst는 InterFace { \t을 구현합니다. protected abstract void OnCreate(); }'이이 오류를 생성하고 있습니다 :'상속 된 메소드의 가시성을 InterFace에서 줄일 수 없습니다'그리고 추상 클래스 내에서'void InterFace.OnCreate()'메소드를 구현할 수 없습니다. – uzay95

+0

하지만 C#에서는 응답하지 않고 오류가 발생했습니다. – uzay95

+0

죄송합니다. 태그 'C#'(으)로 게시되었습니다. Java는 명시 적 인터페이스를 지원하지만 추상 클래스 내에서 구현하는 것은 문제입니다. –

1
  1. 당신은 그것을 할 수 없습니다. 인터페이스 계약에 정의 된 부분 만 구현하는 중간 클래스가 있으면 메소드를 가상 또는 추상으로 설정할 수 있습니다.

  2. 당신은 또한 그것을 할 수 없으며 이유는 간단합니다. 인터페이스는 계약, 구현이 요구하는 작업 집합을 정의합니다. 추상 클래스에서 인터페이스를 명시 적으로 구현하거나 내부 인터페이스를 "내부"로 제한 할 수 있습니다.

  3. 인터페이스를 구현하겠다고 약속했기 때문에이 작업을 수행 할 수 없습니다.

  4. 일단 클래스를 추상으로 표시하면 간접적으로 지적한 또 다른 사항은 인스턴스를 생성 할 수 없다는 것입니다. 따라서 당신은 인스턴스를 생성 할 수있는 첫 번째 클래스에 인터페이스를 구현해야한다는 요구 사항을 전달합니다. 즉, 상속 체인을 의미합니다.

ad1. (C#을 예 1)

interface IDummyInterface 
{ 
    void OnCreate(); 
    void Process(); 
    void OnFinish(); 
} 

abstract class DummyAbstract : IDummyInterface 
{ 
    public virtual void OnCreate() 
    { 
    } 

    public abstract void Process(); 

    public void OnFinish() 
    { 
     OnFinishInternal(); 
    } 

    protected abstract void OnFinishInternal(); 
} 

class DummyImplementor : DummyAbstract 
{ 
    public override void OnCreate() 
    { 
     // some other action here 
     base.OnCreate(); 
    } 

    public override void Process() 
    { 
    } 

    protected override void OnFinishInternal() 
    { 
    } 
} 
+0

네 개의 답변을 주셔서 감사합니다. 이제 하나씩 이해하고 테스트하려고합니다. 중산층 내부에서 보호 된 메서드를 설정할 수 없습니다. 1 차 답변에 모범을 보겠습니까? – uzay95

0

1) 왜 당신이로 시작하는 interface 보호 구현할까요? 어떤 가치도 추가하지 않습니다.

protected abstract void OnCreate(); 

2) 인터페이스는 public 계약을 정의 : 당신은 이미 모든 파생 클래스가 주어진 계약을 준수하는지 확인하는 방법이있다. public 그것은 인터페이스 자체와 동일한 액세스 가능성을 가지고 있음을 의미합니다. 그렇기 때문에 interface 명의 회원을 정의 할 때 접근 수정자를 사용할 수 없습니다.

3) 인터페이스 계약을 파기 할 때 가상 멤버 또는 인터페이스 멤버의 액세스 가능성을 줄일 수 없습니다. 귀하의 예에서는 이 가능하지 않으므로 ClsFirstIOnCreate 인터페이스를 구현하지 않습니다. 따라서 OnCreate()에 액세스 할 수 없습니다.

관련 문제