IT Share you

다른 네임 스페이스의 부분 클래스

shareyou 2020. 12. 10. 21:31
반응형

다른 네임 스페이스의 부분 클래스


다른 네임 스페이스에 부분 클래스를 만들 수 있습니까? 제대로 작동합니까? 전의:

class1.cs

namespace name1
{
    public partial class Foo
    {
        Bar1(){
            return 10;
        }
    }
}

class2.cs

namespace name1.name2
{
    public partial class Foo
    {
        Bar2(){
            return 100;
        }
    }
}

main.cs

using name1;
using name1.name2;

namespace mainClass
{
    public class mainClass
    {
        Foo classFoo = new Foo();
        int Count = classFoo.Bar1() + classFoo.Bar2();
        // Will Count = 110?
    }
}

작동하려면 어떻게해야합니까? (내 예가 올바르지 않은 경우)


클래스의 이름은 그래서, 그것의 네임 스페이스를 포함 name1.Foo하고 name1.name2.Foo두 개의 완전히 분리 된 유형이다. 따라서 귀하의 질문에 대한 짧은 대답은 아니오입니다.

왜 이렇게해야합니까?


부분 클래스는 동일한 네임 스페이스와 동일한 어셈블리에서만 가능합니다.

네임 스페이스는 두 개의 다른 어셈블리에있을 수 있지만 부분 클래스는 그렇지 않습니다.


부분 클래스를 구현하는 동안 고려해야 할 몇 가지 사항은 다음과 같습니다.

  • 부분 클래스의 각 부분에 부분 키워드를 사용하십시오.

  • 부분 클래스의 각 부분의 이름은 동일해야하지만 부분 클래스의 각 부분에 대한 소스 파일 이름은 다를 수 있습니다.

  • 부분 클래스의 모든 부분은 동일한 네임 스페이스에 있어야합니다.

  • 부분 클래스의 각 부분은 동일한 어셈블리 또는 DLL에 있어야합니다. 즉, 다른 클래스 라이브러리 프로젝트의 소스 파일에 부분 클래스를 만들 수 없습니다.

  • 부분 클래스의 각 부분은 동일한 액세스 가능성을 갖습니다. (비공개, 공개 또는 보호)

  • 부분 클래스의 클래스 또는 인터페이스를 상속하면 부분 클래스의 모든 부분에서 상속됩니다.

  • 부분 클래스의 일부가 봉인되면 전체 클래스가 봉인됩니다.

  • 부분 클래스의 일부가 추상이면 전체 클래스가 추상 클래스로 간주됩니다.


작동하지 않습니다. 컴파일러는 줄에 모호한 이름 오류를 제공합니다 Foo classFoo = new Foo();. 부분 클래스가 작동하려면 네임 스페이스가 실제로 형식의 정규화 된 이름의 일부이므로 동일한 네임 스페이스에 있어야합니다.


또한 정적 클래스의 경우 정적 기능을 사용 하는 새로운 C # 6.0의 도움으로 이와 같은 것을 구현할 수 있습니다 .

중히 여기다:

namespace SomeLogic1
{
    public static class Util
    {
        public static int Bar1()
        {
            return 1;
        }
    }
}

namespace SomeLogic2
{
    public static class Util
    {
        public static int Bar2()
        {
            return 2;
        }
    }
}

namespace GeneralStuff
{
    using SomeLogic1;
    using SomeLogic2;

    public class MainClass
    {
        public MainClass()
        {
            // Error CS0104
            // 'Util' is an ambiguous reference between 'SomeLogic1.Util' and 'SomeLogic2.Util'
            var result = Util.Bar1() + Util.Bar2(); 
        }
    }
}  

맞습니다, 컴파일되지 않고 오류 메시지가 명확합니다. 상황을 해결하기 위해 네임 스페이스를 직접 지정할 수 있습니다 (하지만 내가 이해하는 한 이것을 원하지 않습니다).

namespace GeneralStuff
{
    public class MainClass
    {
        public MainClass()
        {
            var result = SomeLogic1.Util.Bar1() + SomeLogic2.Util.Bar2(); 
        }
    }
}

또는 다음과 같이 정적 기능을 사용하여 적용 할 수 있습니다 .

namespace GeneralStuff
{
    using static SomeLogic1.Util;
    using static SomeLogic2.Util;

    public class MainClass
    {
        public MainClass()
        {
            var result = Bar1() + Bar2(); 
        }
    }
}

일부 도우미 / 유틸리티 클래스에 대해이 작업을 수행하는 것이 좋습니다. 그러나 부분 클래스는 다른 사람들이 알아 차린 것처럼 방법이 아닙니다.


MSDN https://msdn.microsoft.com/en-us/library/wa80x488.aspx의 부분 클래스 및 메서드에 대한 제한

참고 URL : https://stackoverflow.com/questions/4504288/partial-class-in-different-namespaces

반응형