.NET 1.1에서 봉인 된 클래스를 확장하는 깨끗하고 직관적 인 접근법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1046405

문제

저는 제품의 여러 릴리스에 사용될 라이브러리를 건축하는 과정에 있으며, 작업의 일부는 .NET 1.1에 존재하지 않는 일부 기능을 강화하는 것입니다. 그것. 아마도 이것의 가장 좋은 예는 String.isnullorempty 메소드입니다. 그의 기능은 우리가 상당히 크게 의존합니다.

.NET의 문자열 클래스가 밀봉되어 있습니다. 원래 문자열을 감싸서 어댑터 또는 데코레이터 패턴을 사용하여 클래스의 기능을 확장하는 것에 대해 생각했지만 이것이 내가하려는 일에 매우 직관적 인 접근법이라고 확신하지는 않습니다. 나도 보았다 stackoverflow의 다른 게시물 비슷한 질문에 대해서는 다시 언급 한 문제를 다시 제기합니다.

어댑터를 사용하여 원하는 기능을 만들 수 있지만 모든 문자열에 대해이 작업을 수행하는 것을 상상할 수는 없습니다.

bool isEmpty = new StringExtensionAdapter(myXmlNode.SelectSingleNode(myXpathString)).IsNullOrEmpty();
if (isEmpty)
{
    // Do something
}

나는이 접근법을 반드시 싫어하지는 않지만 다른 솔루션이 더 나을 수있는 많은 메모리 관리가 발생하는 것처럼 보입니다. 또한, 나는 "StringUtility"라이브러리를 만드는 것에 열광하지 않습니다. 그 접근법은 내가 따르고 싶은 객체 지향 디자인에서 더 멀어지기 때문입니다.

모든 입력은 도움이 될 것입니다. 내가 미쳤고 이러한 접근법 중 하나를 사용해야한다면 알려주세요. 여러 가지가 있기 때문에 솔루션보다 모범 사례를 더 많이 찾고 있습니다.

도움이 되었습니까?

해결책

나는 정적 IsNullorEmpty 방법을 개인적으로 "StringUtility"라이브러리를 선호합니다. 본질적으로 당신은 창조 할 것입니다 확장 방법 그들을 부르는 멋진 구문없이.

다른 팁

정의상, 깨끗한 접근 방식은 없습니다. 어댑터 접근 방식이 .NET 1.1에서 할 수있는 최선이라고 생각합니다. 물론, 이것은 외부 세계를 다룰 때 앞뒤로 가야합니다.

나는 매튜에게 깨끗한 접근이 없다는 데 동의합니다. 데코레이터 패턴은 상속 (또는 적어도 다형성)에 의존하기 때문에 적용 할 수 없으며 System.String을 장식 할 수 없습니다. 동일한 인터페이스를 갖는 클래스를 만들 수 없기 때문에 (밀봉되었으므로)

어댑터는 기본적으로 한 인터페이스를 다른 인터페이스에 적응시키는 데 사용됩니다. 그것은 당신이 여기서하고 싶은 일이 아닙니다. 본질적으로, 당신이 염두에두고있는 것은 래퍼이지만, Matthew가 지적했듯이, 당신은 앞뒤로 많은 것을 전환해야합니다.

아마도 당신은 새로운 유형의 "텍스트"를 지명하고 문자열에서 내재 된 전환을 구현하여 작성해야 할 캐스트의 양을 최소화 할 수 있습니다. 해당 경로를 선택하는 경우, 유형을 불변의 유형으로 디자인해야합니다. 이는 문자열 자체와 동일한 동작이기 때문입니다.

암시 적 연산자를 사용하여 물건을 "자연스러운"으로 만들 수 있습니다.

public class SuperString
{
    public SuperString(string s) { S = s; }

    public static implicit operator SuperString(string s)
    {
        return new SuperString(s);
    }

    public string S { get; private set; }

    public bool IsNot() { return String.IsNullOrEmpty(S); }
}

[TestMethod]
public void Test_SuperString()
{
    SuperString ss = "wee";
    SuperString xx = "";
    if (xx.IsNot()) ss = "moo";
    System.Console.WriteLine(ss.S);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top