>  기사  >  백엔드 개발  >  취약한 기본 클래스 문제는 Go에서 신화인가요?

취약한 기본 클래스 문제는 Go에서 신화인가요?

DDD
DDD원래의
2024-11-02 14:31:30291검색

Is the Fragile Base Class Issue a Myth in Go?

Go 언어: 취약한 기본 클래스 문제 - 신화가 밝혀졌나요?

객체 지향 프로그래밍에서 상속 시 취약한 기본 클래스 문제가 발생합니다. 클래스는 기본 클래스의 변경 사항에 영향을 받습니다. 이 문제는 기본 클래스가 가상 메서드를 사용할 때 특히 분명해집니다.

Go에서는 상속보다 합성을 널리 사용함에도 불구하고 언어 내에서 취약한 기본 클래스 문제가 존재할 수 있다는 우려가 남아 있습니다. 이 주제에 대해 더 자세히 살펴보겠습니다.

취약한 기본 클래스 문제 설명

취약성은 가상 메소드(재정의 가능 메소드)가 있는 기본 클래스가 수정될 때 발생합니다. 수정된 메서드의 동작이 가상 메서드의 존재에 따라 달라지는 경우 이로 인해 상속된 클래스가 손상될 수 있습니다.

그러나 Go에서는 다형성이 없습니다. 유형이 구조체 내에 포함되면 해당 메서드가 래퍼 구조체로 승격되지만 재정의될 수는 없습니다. 즉, 포함된 유형에 정의된 원래 메서드가 항상 호출됩니다.

Java 및 Go의 데모

Java의 취약한 기본 클래스 문제를 설명하려면 다음을 고려하세요. 다음 예:

<code class="java">class Counter {
    void inc() { value++; }
    void incBy(int n) { value += n; }
}

class MyCounter extends Counter {
    @Override
    void inc() { incBy(1); }
}</code>

증분 증가를 위해 for 루프를 사용하도록 기본 클래스 메서드 변경(incBy(int n))은 무한 루프로 인해 MyCounter가 오작동하게 만듭니다.

반대로 Go에서는 다음과 같은 동등한 코드에서 동일한 문제가 발생하지 않습니다.

<code class="go">type Counter struct {
    value int
}

func (c *Counter) Inc() { c.value++ }
func (c *Counter) IncBy(n int) { c.value += n }

type MyCounter struct {
    Counter
}

func (m *MyCounter) Inc() { m.IncBy(1) }</code>

기본 Go의 클래스 메소드가 문제가 있는 for 루프로 수정되었더라도 내장된 유형은 기본에 정의된 원래 메소드를 호출하므로 영향을 받지 않습니다. class.

결론

가상 메서드가 존재하는 Java와 같은 언어에서는 기존의 취약한 기본 클래스 문제가 문제가 되지만 Go에서는 다음과 같은 이유로 크게 완화됩니다. 다형성의 부재. 가상 메소드가 없기 때문에 임베디드 메소드가 항상 기본 클래스에 정의된 원래 구현을 호출하여 상속과 관련된 취약성 문제를 방지합니다.

위 내용은 취약한 기본 클래스 문제는 Go에서 신화인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.