상속 및 다태성 - [OOP 및 Java#2]

11159 단어 computerscienceoopjava

요점을 요약하여 다시 말하다.


추상을 논하는 것은 우리가 장애의 개념을 논해야 한다는 것을 의미한다.클라이언트와 실현자라는 두 역할 간의 장애로 인해 우리는 추상적이고 봉인되었다.
클라이언트가 실현자를 호출하기 위해서는 먼저 이 실현자를 만들고 신뢰할 수 있도록 해야 한다.이것은 클라이언트 코드가 실현자 코드에 의존한다는 것을 의미한다.또한 구현자는 데이터/기능 추상화 및 패키지/정보를 통해 클라이언트에 숨겨진 내용을 숨길 수 있다.나는 이것이 우리에게 결코 이상하지 않다고 생각한다.일상생활에서 우리는 모두 고객이다.우리가 사용하는 전자 설비는 대부분 심리적 블랙박스로 여겨진다.우리는 이 표지들 뒤에 무슨 일이 일어났는지 모른다.그러나 우리는 그것들이 믿을 만하다고 믿는다. 우리는 충분한 정보만 알면 그것을 사용할 수 있다고 믿는다. 우리는 이것에 대해 칭찬을 표한다.

유산


계승은 대상을 대상으로 프로그래밍하는 데 있어서 모두가 알고 있는 사상이다.그것은 두 대상 간의 관계를 주목하는데, 그 중 하나는 다른 대상이다.예를 들어 자동차는 일종의 교통수단이다.따라서 자동차 대상류는 자동차 대상류에서 계승할 수 있다.이것은 요구가 아니라 설계 원칙이다.본질적으로 객체 지향 원칙은 다음과 같은 목표를 실현하고자 한다.

Where similar functions are carried out by distinct pieces of code, it is generally beneficial to combine them into one by abstracting out the varying parts.
- Benjamin C.Pierce


우리 예를 하나 봅시다.
종이의 크기와 색깔을 설명하기 위해 종이 대상을 원한다고 가정하십시오.
class Paper{
    private int height;
    private int width;
    private String color;

    Paper(int height, int width, String color){
        this.height= height;
        this.width = width;
        this.color = color;
    }
}
현재 표준 기본 인쇄지 (일반적인 A4 크기의 종이) 가 필요하다면 세 가지 방법이 있다.
  • 1. 기본 매개 변수를 사용하여 종이 구조 함수를 호출하는 방법 만들기
  • Paper PrinterPaper(){
        return new Paper(297, 210, "white");
    }
    
  • 2. Paper 클래스의 구조 함수를 다시 로드합니다.이것은 다른 방법을 성명하여 원시 구조 함수와 약간 다른 구조 함수를 서명하고 자바는 이를 서로 다른 함수로 간주하며 자바는 주어진 매개 변수에 따라 어떤 함수를 호출할지 알게 된다는 것을 의미한다.
  • class Paper{
        private int height;
        private int width;
        private String color;
    
        // original
        Paper(int height, int width, String color){
            this.height= height;
            this.width = width;
            this.color = color;
        }
        // added, will be called if no parameters are given
        Paper(){
            this.height= 297;
            this.width = 210;
            this.color = "white"
        }
    }
    
  • 3. 마지막 방법은 상속을 통해PrinterPaper는 종이이기 때문에 Paper 클래스를 확장할 수 있습니다.
  • class PrinterPaper extends Paper{
        PrinterPaper(){
            super(297,210,"white");
        }
    }
    
    우리는 상속은 단지 일하는 방식의 하나일 뿐이라는 것을 볼 수 있다.그것은 보통 대상 사이에 명확한 is-a 관계가 존재할 때 작용한다.PrinterPaper를 구성하는 세 가지 방법을 비교한 결과, 세 번째 방법은 코드 크기가 상대적으로 짧고 코드 조직에 도움이 되는 것 같다.
  • PrinterPaper와 관련된 내용은 별도의 PrinterPaper 클래스(관심사 분리)로 분리할 수 있습니다.
  • PrinterPaper와 Paper 간에 공유되는 내용은 부모 속성이나 방법을 호출하는 키워드인'super'와 함께 사용할 수 있습니다.
  • 다태성


    Of many forms


    자바에서, 특히 계승에 있어서, 우리는 공유 기능에 대한 코드 중복을 피하기를 바란다.그러나 코드를 수정해야 합니다.이런 수요는 통상적으로 새로운 종류를 만들 때 고유한 것이다.만약 없다면, 우리는 우선 어떤 의미 있는 것도 분리해 내지 않을 것이다.
    계승된 상황에서 우리는 부류와 자류 간에 코드를 공유하도록 지정하지만 자류에서도 두 가지 주요 차이가 있을 수 있다.
  • 하위 클래스는 상위 클래스가 영원히 실행하지 않는 작업을 수행해야 한다.이 예에서, 우리는 하위 클래스에서 새로운 방법을 썼다.
  • 하위 클래스는 상위 클래스도 수행해야 하는 일부 작업을 수행해야 하지만 약간의 조정이 필요합니다.이런 상황에서 우리는 방법을 사용하여 다시 쓴다.
  • 주의: 하위 클래스가 상위 클래스와 다르지 않으면 자동으로 상위 클래스로부터 같은 방법을 계승합니다.
    Java에는 자주 다시 쓰는 두 가지 방법이 있습니다.
  • toString(): 객체가 화면에 플롯되는 방식에 영향을 주고 플롯할 때 객체의 일부 피쳐를 수정하여 표시합니다.
  • equals(): 대상이 정확한 복사본이라는 사실을 바탕으로 두 대상이 같은지 확인합니다.
    equals 방법에 대한 설명:
  • // using the Paper example
    @override
    public boolean equals(Object obj){
        if(this == obj){
            return true; // if exact same copy
        } else if (obj instanceof Paper){ 
        // if belongs to the same class
            Paper p = (Paper) obj; // IMPT! type-cast before you can use the 
                                // Paper class methods
            return this.height == p.height && this.width == p.width 
    && this.color.equals(p.color);
        } else { // not even of the same class
            return false;
        }
    }
    
    toString 방법은 이해하기 쉽다.선택한 속성에 따라 인쇄할 문자열을 포맷하기만 하면 됩니다.그것은 동적일 필요가 없다.문자열만 되돌려주면 작동합니다.
    @override
     public String toString() {
        return this.color + " paper of size: " + this.height + " " + this.width;
    }
    
    방법 서명은 반드시 완전히 같아야만 다른 방법을 덮어쓸 수 있음을 일깨워 주십시오.이 방법의 헤더가
    public boolean equals(Object obj){
    //...
    }
    
    같은 제목을 사용해야 합니다.따라서 클래스 객체를 자신의 클래스 객체로 대체하는 것은 불가능합니다.
    // Example of a wrong way to override
    @override
    public boolean equals(Paper p){
    //...
    }
    //This is wrong
    
    일반적으로 반환 형식은 한 방법이 다른 방법을 다시 쓰기 위해 같다.그러나 받아들일 수 있는 상황에서 반환 유형은 아버지 방법보다 구체적이다(반대가 아니다!).이것은 대체성 원칙에 따라 자류는 반드시 모든 방면에서 부류의 기대를 만족시켜야 하기 때문에 작용할 것이다.따라서 더 구체적인 대상은 더 일반적인 대상(부 대상)을 사용하는 모든 클라이언트 코드와 함께 작동합니다.나는 다음 문장에서 이것에 대해 상세하게 논술할 것이다.

    좋은 웹페이지 즐겨찾기