[TIL]インタフェースを実装する場所(例)

6282 ワード

1)NewleExamクラス

public class NewlecExam extends Exam implements ConsoleListener {

	...
    
    public void onPrint(Exam exam1) {
		
	}
    
	@Override
	public void onPrint(Exam exam1) {
		System.out.printf("컴퓨터 : %d\n", nexam.getCom());	
	}

	@Override
	public void onInput(Exam exam1) {
		
		Scanner scan = new Scanner(System.in);
		System.out.print("컴퓨터 > ");
		com = scan.nextInt();
	}
}

  • New lecExamでonPrintとonInputを上書きする場合は、Examテストをパラメータとして使用する必要はありません.

  • このように表現すると、衝突が発生します.
  • public class NewlecExam extends Exam {
    
    	...
        
      class AAA implements ConsoleListener {
        
    	@Override
    	public void onPrint(Exam exam1) {
    		System.out.printf("컴퓨터 : %d\n", nexam.getCom());	
    	}
    
    	@Override
    	public void onInput(Exam exam1) {
    		
    		Scanner scan = new Scanner(System.in);
    		System.out.print("컴퓨터 > ");
    		com = scan.nextInt();
    	}
        }
    }
  • は、クラスに新しいクラスを作成し、競合を防止し、リソースをすぐに使用できるようにします.これをネストクラスと呼びます.
  • package part3.ex5.iface;
    
    import java.util.Scanner;
    
    public class NewlecExam extends Exam{
    	
    	private int com;
    	
    	public int getCom() {
    		return com;
    	}
    	
    	public void setCom(int com) {
    		this.com = com;
    		
    	}
    	
    	public NewlecExam() {
    		this(0,0,0,0);
    	}
    	
    	public NewlecExam(int kor, int eng, int  math, int com) {
    		super(kor, eng, math);
    		this.com = com;
    	}
    	
    	
    	public int total() {
    		
    		return super.total() + com ;
    		
    	}
    	
    	public double avg() {
    		
    		return this.total()/4.0;
    	}
    	
    	public void onPrint(Exam exam) {
    		
    	}
    	
    }
    

    2)ExamConsole類

    public class ExamConsole {
    	
    	private ConsoleListener listener;
    	
    	private Exam exam;
    
    	public void setListener(ConsoleListener listener) {
    		this.listener = listener;
    	}
    
    	...
       
    		public void print() {
    	      
    	      Scanner scan = new Scanner(System.in);
    	      
    	      if(printer != null)
    	    	  printer.printBanner();
                  
    	      else {
              
    	      System.out.println("┌───────────────────────────────────┐");
    	      System.out.println("│             성적 출력            │");
    	      System.out.println("└───────────────────────────────────┘");
    	      }
    	      
    	      System.out.println("국어 : " + exam.getKor());
    	      System.out.println("영어 : " + exam.getEng());
    	      System.out.println("수학 : " + exam.getMath());
              
    	      // 새롭게 추가된 과목을 출력할 수 있는 코드 영역
              
    	      if(listener != null)
    	    	  listener.onPrint(exam);
    	      
    
    	      int total = exam.total();
    	      double avg = exam.avg();
    	      System.out.println("총점 :" + total);
    	      System.out.printf("평균 : %.2f\n",  avg);
    	   }
    		
    
     
    		public void input() {
    	      
    	      Scanner scan = new Scanner(System.in);
    	      
    	      System.out.println("┌───────────────────────────────────┐");
    	      System.out.println("│              성적 출력           │");
    	      System.out.println("└───────────────────────────────────┘");
    	      
    	      System.out.print("국어 > ");
    	      int kor  = scan.nextInt();
    	      System.out.print("영어 > ");
    	      int eng = scan.nextInt();
    	      System.out.print("수학 > ");
    	      int math = scan.nextInt();
    	      
    	      exam.setKor(kor);
    	      exam.setEng(eng);
    	      exam.setMath(math);
    	      
    	      if(listener != null)
    	    	  listener.onInput(exam);
    	      
    	   }
    }
    

    3)ConsoleListenerクラス

    
    public interface ConsoleListener {
    	void onPrint(Exam exam);
    	void onInput(Exam exam);
    
    }
    

    4)NewleConsoleListenerクラス

    public class NewlecConsoleListener implements ConsoleListener {
    
    	@Override
    	public void onPrint(Exam exam) {
    		NewlecExam nexam = (NewlecExam) exam;
    		System.out.printf("컴퓨터 : %d\n", nexam.getCom());
    		
    		
    	}
    
    	@Override
    	public void onInput(Exam exam) {
    		NewlecExam nexam = (NewlecExam) exam;
    		
    		Scanner scan = new Scanner(System.in);
    		System.out.print("컴퓨터 > ");
    		int com = scan.nextInt();
    		
    		nexam.setCom(com);
    		
    	}
    	
    
    }

  • ConsoleListenerインタフェースのインプリメンテーション.

  • インプリメンテーション->インタフェース.これも継承です.(約定のみ継承)
  • 	public void onPrint() {
    		NewlecExam exam = (NewlecExam) console.getExam();
    		System.out.printf("컴퓨터 : %d\n", exam.getCom());

  • 上記のコードで記述すると、データが挿入されていないという問題があります.

  • コンピュータ科目を出力できません.
  • 5)プログラム類

    public class Program {
    
       public static void main(String[] args) throws IOException{
    	   
           NewlecExam exam = new NewlecExam();
           ExamConsole console = new ExamConsole();
           console.setExam(exam);
    	   
           //ConsoleListener listener = new NewlecConsoleListener();
           NewlecExam.AAA listener = exam.new AAA(); -> 중첩 클래스에서 호출
           console.setListener(listener);
           
           console.input();
           console.print();
    }
  • ConsoleListener listener = new NewlecConsoleListener();参照型に制限されます.
  • NewlecExam.AAA listener = exam.new AAA();->ネストされたクラスで呼び出されます.

  • オーバーラップクラスをプログラムに移行した後、AAA listener = new AAA();に置き換えます.

  • 元のExamテストをパラメータに書き込むことができます.
  • 		class AAA implements ConsoleListener{
    			
    		// int com=10;
    
    		@Override
    			public void onPrint(Exam exam1) {
    
    				//int com = 100;
    				//NewlecExam nexam = (NewlecExam) exam;
    				//System.out.printf("컴퓨터 : %d\n", nexam.getCom());
    				System.out.printf("컴퓨터 : %d\n", exam.getCom());
    			
    			
    			}
    
    			@Override
    			public void onInput(Exam exam1) {
    				//NewlecExam nexam = (NewlecExam) exam;
    			
    				Scanner scan = new Scanner(System.in);
    				System.out.print("컴퓨터 > ");
    				int com = scan.nextInt();
    				exam.setCom(com);
    			
    			}
    		
    		}
  • this;コールthis.com.
  • NewlecExam.this;コールNewlecExam.this.com.

  • NewleExamのネストされたクラス部分を切り取り、プログラムに移動できます.