2016-06-30 3 views
0

현재 내가 쓴 주제는 코드 공유입니다. 여러 파일간에 코드를 공유하기 위해 액세스 수정 자 internal을 사용하는 것이 좋습니다. 그러나 그것은 무엇입니까? 아니면 내가 틀렸어? 모든 사람이 소스에 액세스 할 수 없기 때문에 링크를 게시 할 수 없습니다.`internal` 액세스 한정자를 사용하여 클래스를 여러 파일로 분할 할 수 있습니까?

하나의 파일 (인터페이스 또는 추상 클래스와 같은)에 클래스 정의를 포함하고 다른 파일에이 파일을 구현할 수 있습니까? 여기에서 internal을 사용하고 있습니까?

다음은 일부 의사 코드입니다 (분명히 작동하지 않음). 다른 파일에

internal static class SongLoader 
{ 
    internal async static Task<IEnumerable<Song>> Load(); 
    internal async static Task<Stream> OpenData(); 
} 

구현 :

internal static class SongLoader 
{ 
    internal const string Filename = "songs.json"; 

    internal static async Task<IEnumerable<Song>> Load() 
    { 
     // implementation 
    } 

    internal static Stream OpenData() 
    { 
     // implemenation 
    } 
} 

또는 internal 액세스 한정자를 사용하면서, Load() 하나 개의 파일 및 다른에 OpenData()에 정의 된 가질 수 있습니다 하나 개의 파일에 정의? 이것이 가능한가? 방법?

+0

같은 어셈블리에있는 파일 내 : https://msdn.microsoft.com/en-us/library/7c5ka91b.aspx –

+0

@Stanley : 예, 같은 어셈블리에 컴파일되므로 동일한 어셈블리에 있어야합니다. ([공유 프로젝트] (https://developer.xamarin.com/guides/cross-platform/application_fundamentals/shared_projects/) 참조). – grabner

+1

'내부 '는 가시성 수정 자일뿐입니다. 클래스를 여러 파일로 분할하는 것과는 아무런 관련이 없습니다. 그 키워드는'partial'입니다. 그러나 당신이 묘사하고있는 "수업의 정의"와 같은 것은 없습니다. 가장 가까운 것은 "부분적인 메소드"이지만, 그들은'void'를 반환해야하며 항상 private 메소드입니다. –

답변

2

internal 지정자 클래스/부재를 제한하는 데 사용되는 조립체를 포함하는 이외의 것에 사용된다.

코드 공유는 partial 클래스를 통해 이루어집니다. 하나의 파일에는 클래스 의 일부를, 다른 파일에는 다른 부분을 가질 수 있습니다. 파일 B

public partial class MyClass 
{ 
    public void Bar() 
    { 
    } 
} 

당신은 C에서와 같이 하나 개의 파일에 하나 개의 파일에 선언과 정의를 가질 수 없습니다 ++에서 파일 검색

public partial class MyClass 
{ 
    public void Foo() 
    { 
    } 
} 

에서

. 이러한 요구 사항이있는 경우 interface 또는 abstract 클래스를 고려해야합니다.

+0

제 경우에는 다른 어셈블리 사이에 멤버를 숨기는 것이 도움이 될 것입니다. 그래서 다른 구현을 할 수있을뿐만 아니라 동일한 "계약"을 사용합니다. 선언과 정의의 분리에 관하여 : 이것은 어떻게 든 코드 공유에 도달하는 방법의 예일뿐입니다. 구체적인 예에서'Foo()'는'Bar()'를 호출하지만, 어셈블리에 따라'Bar()'의 다른 변형이 있습니다. – grabner

+0

기본적으로 서로 다른 어셈블리에 대해 동일한 기능을 구현할 수는 없습니다. 보유하고있는 문제에 대해 더 자세히 말하면 대체 솔루션에 대해 논의 할 수 있습니다. –

+0

코드 공유 옵션에 대한 지식을 얻고 싶습니다. '내부'가 (부분적으로) 옵션 중 하나로 언급되었다. 그래서'내부 '는 코드 공유에 도움이되지 않는 것 같습니다. 이제 당신이 제안한대로'partial'을 사용하려고 시도했지만, 여기서 모든 이점을 볼 수는 없습니다. 관심이 있다면 내 시도 [여기] (https://codeshare.io/dDOXz)를 들여다 볼 수 있습니다. – grabner

4

internal은 코드가 사용자 기능에 액세스 할 수있는 액세스 수정 자입니다. 동일한 네임 스페이스 내의 여러 파일로 클래스를 분할하려는 경우 찾고있는 것은 partial 키워드입니다.

https://msdn.microsoft.com/en-us/library/wa80x488.aspx

partial 같은 함수 정의를 두 번 정의 할 수 없습니다; 당신이 목표로하는 것이라면 기본 클래스를 재정의하거나 가상화하거나 기본 클래스로 작업해야합니다. Partial은 때때로 유용하지만 클래스가 어디에서 발견되는지 확실하지 않으면 다소 혼란 스러울 수 있습니다.

+1

같은 함수를 부분 클래스로 두 번 정의 할 수 없습니다. OP가 원하는 부분입니다. –

+0

똑같은 함수 정의를 두 번 찾으면 작동하지 않습니다. 찾고있는 경로라면 기본 함수를 재정의해야합니다. 내 대답에 그 주석을 추가했습니다. 단지 안전합니다. – MartijnK

1

액세스 한정자는 구현 방법이 아닌 코드를 볼 수있는 사람 만 처리합니다.
원하는 작업을 수행하는 가장 가까운 방법은 abstract classes을 사용하는 것입니다. 일례로서

:

internal abstract class SongLoader //under SongLoader.cs 
{ 
    internal async virtual Task<IEnumerable<Song>> Load(); 
    internal async virtual Task<Stream> OpenData(); 
} 

internal sealed class SongLoaderImplementer : SongLoader //under SongLoaderImplementer.cs 
{ 
    internal override async Task<IEnumerable<Song> Load() {} 
    internal override async Task<Stream> OpenData() {} 
}