메서드 체인을 사용할 수 있는 String 클래스 만들기
메서드 체인을 사용할 수 있는 String 클래스 만들기
경위
VBA의 쇼보 점으로서, String 형으로 메소드 체인을 사용할 수 없는 점이 있다.
메소드 체인이라고 하는 것은 xxx.Trim.SubString(0,1) 와 같이 메소드를 계속해 사용할 수 있는 기능.
메소드 체인으로 하기 위해서는, 클래스를 반환하는 메소드를 만들면 좋지만, String형도 동시에 돌려주고 싶다. 그런 불가능? 라고 생각되었지만, 시행착오해 보았는데, 실용이 되는 레벨이 되었으므로 하는 방법을 소개한다.
사용성은 다음과 같다. 메소드를 얼마든지 연결하여 사용할 수 있고, 메소드의 반환값을 String형과 동등의 동작으로 할 수 있다.
Sub StringEx_Sample()
Dim s As IString
Set s = New StringEx
'普通にStringっぽく使える
s = "abcdefg "
Debug.Print s
Debug.Print s & "desu"
'Java/C# のようなメソッドチェーンも使える
Debug.Print s.SubString(2, 4)
Debug.Print s.SubString(2, 4).Length
Debug.Print s.Length
Debug.Print s.Trim.Length
End Sub
-----------------------
abcdefg
abcdefg desu
cd
2
9
7
소스 입력시 인텔리센스도 물론 사용할 수 있다.
소스 해설
할 일.
· String 형을 돌려주는 메소드는 IString 인터페이스를 돌려주도록 한다.
→이것으로 메소드 체인을 실현한다.
・IString 인터페이스에 String형의 규정의 프롭퍼티를 작성해, 메소드를 생략했을 경우, String형을 돌려주도록 한다.
→ 클래스이면서, String 형으로서도 취급할 수 있게 된다.
IString 인터페이스
인터페이스를 사용하지 않아도 만들 수 있지만, 좋아하기 때문에.
캐릭터 라인을 보관 유지하는 프로퍼티 「Value」를 정의한다.
Value 속성을 지정된 속성으로 설정하면 선택 사항입니다.
지정된 속성을 만들려면 다음 단계가 필요합니다.
Sub StringEx_Sample()
Dim s As IString
Set s = New StringEx
'普通にStringっぽく使える
s = "abcdefg "
Debug.Print s
Debug.Print s & "desu"
'Java/C# のようなメソッドチェーンも使える
Debug.Print s.SubString(2, 4)
Debug.Print s.SubString(2, 4).Length
Debug.Print s.Length
Debug.Print s.Trim.Length
End Sub
-----------------------
abcdefg
abcdefg desu
cd
2
9
7
이것은 인터페이스 측에 지정해 두면, Impliments한 쪽에서도 유효하게 된다.
인터페이스를 사용하지 않는 경우는, StringEx 측의 Value property에 상기의 설정을 실시해 주세요.
Option Explicit
Public Function SubString(ByVal starts As Long, Optional ByVal ends As Long = -1) As IString
End Function
Public Property Get Value() As String
'Attribute Item.VB_UserMemId = 0
End Property
Public Property Let Value(v As String)
End Property
Public Property Get Length() As Long
End Property
Public Function Trim() As IString
End Function
StringEx 클래스
메소드 체인으로 하고 싶은 경우, 편집한 결과를 NewInstance 메소드로 새로운 인스턴스의 StringEx 클래스를 돌려주도록 한다. (SubString 메서드, Trim 메서드 참조)
이 클래스를 폼과 같이 정적 클래스(규정의 인스턴스)로 사용할 수 있도록 한다.
절차는 다음과 같습니다.
StringEx.NewInstance() 라는 생성자를 사용할 수 있게 된다.
Option Explicit
Implements IString
Private mBuf As String
Public Function NewInstance(ByVal s As String) As IString
Set NewInstance = New StringEx
NewInstance.Value = s
End Function
Private Property Get IString_Length() As Long
IString_Length = Len(mBuf)
End Property
Private Function IString_SubString(ByVal starts As Long, Optional ByVal ends As Long = -1) As IString
If ends = -1 Then
Set IString_SubString = Me.NewInstance(Mid$(mBuf, starts + 1))
Else
Set IString_SubString = Me.NewInstance(Mid$(mBuf, starts + 1, ends - starts))
End If
End Function
Private Function IString_Trim() As IString
Set IString_Trim = Me.NewInstance(Trim(mBuf))
End Function
Private Property Let IString_Value(RHS As String)
mBuf = RHS
End Property
Private Property Get IString_Value() As String
IString_Value = mBuf
End Property
스스로 만든 라이브러리의 String 형의 반환값을 이 예를 바탕으로 IString 인터페이스를 되돌리면 편리하게 사용할 수 있다고 생각한다.
무료 소프트웨어를 만들고 있습니다.
엑셀을 편리하게 하는 250이상의 기능을 체계화한 애드인은 이쪽입니다.
「RelaxTools Addin」창의 모 대상 대상 수상 소프트
h tp : // 그 f라고. 오 s 어라. 네 t / re x와 ls /
Reference
이 문제에 관하여(메서드 체인을 사용할 수 있는 String 클래스 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/RelaxTools/items/a18fa3f53826483ffa29텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)