>

다음 코드를 발견했습니다 :

class BindableTextInputEditText : TextInputEditText {
    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
    fun bind() {
        setTextAndCursor(text)
    }
    private fun TextInputEditText.setTextAndCursor(text: String?) {
    }
}

setTextAndCursor가 확장 인 이유는 확실하지 않습니다. 비공개 인 경우 일반적으로 대부분의 확장 프로그램처럼 일반적으로 사용할 수 없습니다. 그렇다면 왜 일반적인 기능이 아닌 확장 기능을 사용해야합니까?


  • 답변 # 1

    특정의 경우, 확장은 수신자 클래스 ( TextInputEditText )를 확장하는 클래스에서 선언됩니다. ), 일반 메소드를 선언하면 확장과 동일한 방식으로 작동하거나 적어도 동일한 호출 구문을 생성합니다. 그래서 나는 여기에 확장을 사용하는 것이 의미가 없다고 말하고 싶습니다 (일부 정적 메소드의 성능을 언급 할 수 있습니다.

    즉, 일반적으로 비공개 확장 프로그램을해제할 수 없습니다. 확장의 요점은 일반적인 사용법 일뿐만 아니라 object.method() 를 사용하여보다 자연스럽게 정적 도우미를 표현하는 방법입니다.  구문.

    이것은 프로그래머가 내장 메소드와 확장 메소드를 비슷하게 호출 할 수있게 해줍니다. 주요 목표는 좋은 구문이기 때문에 개인 상황에서도 유용하게 사용할 수 있습니다.

    setTextAndCursor 인 경우   TextInputEditText 에 있기를 원했던 방법입니다 , 그러나 그것은 당신의 개인 상황에서만 유용하다. 그리고 그것을 그것을 개인 확장으로 선언하는 것이 합리적이다 (이것이 당신의 이상한 시나리오 인 그 클래스의 서브 클래스에 이미있는 경우를 제외하고).

  • 답변 # 2

    확장자로 선언하면any TextInputEditText 에서 호출 할 수 있습니다. this 뿐만 아니라  (또는 다른 BindableTextInputEditText 사례 ). 다음과 같은 방법을 사용할 수 있습니다

    fun bindOther(textField: TextInputEditText, text: String?) {
        textField.setTextAndCursor(text)
    }
    
    

    이러한 사용법은 이전에 클래스에 있었으며 제거되었습니다.

  • 이전 차별적 인 노조를 주장하는 방법은 타이프 스크립트 단위 테스트에서 특정 변형입니까?
  • 다음 c# - 절대 경로 Azure 저장소 계정을 얻는 방법?