11/05/2018, 11:53

Liskov Substitution Principle về kế thừa trong Java

Hallo anh em, Có ai giỏi về Liskov Substitution Principle (Nguyên lý thay thế Liskov) cho mình hỏi 1 chút vì mình đọc mãi thông tin các trang mà vẫn không hiểu về vấn đề này kĩ lắm . Mình có 1 đoạn code Java như dưới đây, trong đó có 5 lỗi vi phạm về nguyên lý Liskov. Ai hiểu rõ về nguyên lý này ...

Hallo anh em,
Có ai giỏi về Liskov Substitution Principle (Nguyên lý thay thế Liskov) cho mình hỏi 1 chút vì mình đọc mãi thông tin các trang mà vẫn không hiểu về vấn đề này kĩ lắm . Mình có 1 đoạn code Java như dưới đây, trong đó có 5 lỗi vi phạm về nguyên lý Liskov. Ai hiểu rõ về nguyên lý này có thể giúp mình tìm và giải thích tại sao nó lại vi phạm được ko ? Cám ơn mọi người trước

Mã:
public class Library {	
	    class Book{
	        private int site;
	        private String _title;
	        private String _autor;


	        private int _currentSite = 0;


	        public Book(int sites, String title, String autor){
	            this.site = sites;
	            this._title = title;
	            this._autor = autor;
	        }


	        public void page(){
	            if(this._currentSite<this.site){
	                this._currentSite++;
	            }
	        }


	        public void toPage(int site){
	            if(site<this.site){
	                this._currentSite = site;
	            }
	        }


	        public String getAutor(){
	            return this._autor;
	        }
	    }


	    class TelefonBook extends Book{
	        public TelefonBook(int sites){
	            super(sites,"TelefonBook",null);
	        }


	        @Override
	        public String getAutor(){
	            return "No Autor";
	        }
	    }


	    class PreviewBook extends Book{
	        // Book dient nur zur Preview in ein Book
	        private int _maxErstesites;
	        public PreviewBook(int sites, String title, String autor){
	            this(sites,title,autor,1);
	        }


	        public PreviewBook(int sites, String title, String autor, int maxErstesite){
	            super(sites,title,autor);
	            this._maxErstesites = maxErstesite;
	        }


	        @Override
	        public void page(){
	            if(super._currentSite < this._maxErstesites){
	                super.page();
	            }
	        }


	        @Override
	        public void toPage(int site){
	            if(site <= this._maxErstesites){
	                super.toPage(site);
	            }
	        }
	    }


	    class EBook extends Book{
	        // prozentual gelesenen Anteil des Bookes
	        private float percent;


	        public EBook(int sites, String title, String autor){
	            super(sites,title,autor);
	            this.percent = 0;
	        }


	        @Override
	        public void page(){
	            super.page();
	            this.percent = ((float) super._currentSite)/((float) super.site);
	        }


	        @Override
	        public void toPage(int site){
	            super.toPage(site);
	            this.percent = ((float) site)/((float) super.site);
	        }
	    }


	    class ArabischesBook extends Book{
	        ArabischesBook(int sites, String title, String autor){
	            super(sites,title,autor);
	            super._currentSite = sites;
	        }


	        @Override
	        public void page(){
	            if(super._currentSite>0){
	                super._currentSite--;
	            }
	        }
	    }
	    
	}
0