F #에서 데이터를 모델링하는 더 좋은 방법이 필요하지 않으므로?F #에 보호 된 액세스 한정자가없는 이유는 무엇입니까?
33
A
답변
33
람다 식에서 멤버를 자주 호출해야하기 때문에 F #에서는 protected
수정자가 상당히 문제가 될 수 있습니다. 그러나 그렇게하면 더 이상 클래스 내에서 메소드에 액세스 할 수 없습니다. 또한 C#으로 선언 된 보호 된 멤버를 사용할 때 혼란을 야기합니다 (예 : this SO question 참조). 당신이 protected
멤버를 선언 할 수 있다면, 다음 코드는 놀라운 일이 될 수있다 :
type Base() =
protected member x.Test(a) = a > 10
type Inherited() =
inherit Base()
member x.Filter(list) =
list |> List.filter (fun a -> x.Test(a))
이 코드는 작동하지 않을 것입니다, 당신의 현재 인스턴스와 다른 객체 인 (람다 함수에서 Test
를 호출하고 있기 때문에 Test
) 코드가 작동하지 않습니다. 이것이 F #에서 protected
수식어를 지원하지 않는 주된 이유라고 생각합니다.
F #에서는 일반적으로 C#보다 구현 상속 (즉, 기본 클래스에서 상속)을 사용하므로 훨씬 자주 protected
이 필요하지 않습니다. 대신 일반적으로 인터페이스 (객체 지향 F # 코드에서)와 고차 함수 (기능 코드에서)를 사용하는 것이 좋습니다. 그러나 구현 상속을 피하는 것 이외에 일반적으로 protected
의 필요성을 피하는 방법을 말하는 것은 어렵습니다. 귀하의 질문에 동기를 부여하는 구체적인 예가 있습니까?
7
관련 문제
- 1. "외부"액세스 한정자가없는 이유는 무엇입니까?
- 2. 보호 된 액세스 지정자에 대한 이론적 근거
- 3. 보호 된 멤버 인 'object.MemberwiseClone()'에 액세스 할 수 없습니다.
- 4. F # 차별화 된 유니온을 직렬화해야하는 이유는 무엇입니까?
- 5. 액세스 암호로 보호 된 디렉토리
- 6. VB.NET에서 보호 된 멤버에 액세스
- 7. JQuery로 보호 된 REST 끝점에 액세스
- 8. 다른 패키지에있을 때 내 서브 클래스가 수퍼 클래스의 보호 된 변수에 액세스 할 수없는 이유는 무엇입니까?
- 9. 속성을 보호/개인용으로 설정하는 성능상의 이유는 무엇입니까?
- 10. 파생 클래스에서 클래스의 보호 된 멤버에 액세스
- 11. TYPO3 보호 된 사이트에서 GET 변수에 액세스
- 12. 파이썬 - 보호 된 네트워크 리소스에 액세스
- 13. F #에 해당하는 Eval
- 14. 델파이의 "엄격한 개인"과 "보호 된"액세스 한정자의 차이점은 무엇입니까?
- 15. Iron Python에서 .NET 형식의 보호 된 멤버에 액세스
- 16. FxCop이 보호 대상을 공개로 취급하는 이유는 무엇입니까?
- 17. F #에 무료 기능이 있습니까?
- 18. 파생 클래스의 인스턴스에서 보호 된 멤버에 액세스 할 수없는 이유는 무엇입니까?
- 19. 공유 폴더 액세스 (보호 됨)
- 20. $ _SESSION [USERID]에 액세스 할 수없는 이유는 무엇입니까?
- 21. ASP.NET - 보호 된 변수
- 22. 보호 된 멤버의 범위
- 23. F #이이 유형을 추론하는 이유는 무엇입니까?
- 24. F # 레코드에 AllowNullLiteralAttribute가 허용되지 않는 이유는 무엇입니까?
- 25. sys.argv []에 공백이있는 이유는 무엇입니까?
- 26. 결합 된 보호 된 블록
- 27. C++에 클래스와 구조체가 모두있는 이유는 무엇입니까?
- 28. C#에 친구 클래스가없는 이유는 무엇입니까?
- 29. "보호 된 내부"범위
- 30. 보호 된 필드가 하위 클래스에 표시되지 않습니다.
이것은 사실이지만 컴파일러의 구현 아티팩트입니다. F #과 같은 .NET 언어가 클로저를 수용하고 의도 한 의미를 갖는 중첩 클래스를 생성 할 수 없다는 근본적인 이유는 없습니다. – kvb
좋은 설명. F # 컴파일러가 lambdas 및 기타 기능적 구성을 지원하기 위해 만드는 객체를 잊어 버리는 것은 쉽습니다. 나는 C#에서 자주 사용되는 ORM을 작성하고있다. 그것은 공급자 모델의 무언가를 사용합니다. SqlRepository, OracleRepository 등으로 확장 될 수있는 추상 Repository 클래스가 있습니다. 테이블에 대한 스키마 정보를로드하는 보호 된 메소드가 필요했습니다. 이렇게하는 더 좋은 방법에 대한 아이디어가 있습니까? – Daniel
@kvb - 나는 똑같은 생각. 컴파일 된 멤버가 파생 클래스의 람다에서 액세스되는 경우 컴파일러에서 확인할 수있는 방법이 있습니까? – Daniel