2016-06-30 13 views
0

私が現在行っているトピックはコード共有です。複数のファイル間でコードを共有するには、アクセス修飾子internalを使用することをお勧めします。しかしそれは?それとも間違っているのですか?誰もがソースにアクセスできないため、リンクを投稿できません。クラスを複数のファイルに分割するために `internal`アクセス修飾子を使用できますか?

クラスの定義を1つのファイル(インターフェイス、抽象クラスなど)にして、別のファイルに実装することはできますか(ここでは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() 1つのファイルと別でOpenData()で定義されていることが可能である1つのファイルに定義?これは可能ですか?どうやって?

+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

'internal'は可視性変更子です。クラスを複数のファイルに分割することとは関係ありません。そのキーワードは 'partial'です。しかし、あなたが描いている "クラスの定義"のようなものはありません。最も近いものは「部分的メソッド」ですが、それらは 'void'を返さなければならず、常にprivateメソッドです。 –

答えて

2

internal指定子を含むアセンブリ以外に使用されるクラス/メンバーを制限するために使用されます。

コード共有は、partialクラスによって実現されます。 1つのファイルにクラス の一部を含めることができ、別のファイルに他の部分を含めることができます。ファイルB

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

ファイルに

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

あなたは、C++のように1つのファイルに1つのファイルと定義宣言を持つことができません。 このような要件がある場合は、interfaceまたはabstractクラスについて考える必要があります。

+0

私の場合は、別のアセンブリ間にメンバーを隠すことが役に立ちます。だから私は別の実装を持つことができますが、同じ "契約"も使用します。宣言と定義の分割について:これは、何らかの形でコード共有に到達する方法の一例にすぎません。私の具体的な例では、 'Foo()'は 'Bar()'を呼び出していますが、アセンブリによって 'Bar()'のバリエーションが異なります。 – grabner

+0

基本的に、異なるアセンブリに対して特別に実装された同じ機能を持つことはできません。あなたが持っている問題についてもっと詳しく話すなら、代わりの解決法について話し合うことができます。 –

+0

私はコード共有オプションでいくつかの知識を得たいです。 'internal'がオプションの一つとして言及されました(' partial'以外に)。だから、 'internal'はコード共有を助けてくれないようです。今度はあなたが提案したように 'partial'を使いこなそうとしましたが、私はここで完全な利益を見ません。あなたが興味があれば、私の試行[ここ](https://codeshare.io/dDOXz)を調べることができます。 – grabner

4

internalは、あなたの機能にアクセスできるコードを扱うアクセス修飾子です。クラスを同じ名前空間内の複数のファイルに分割する場合は、partialキーワードを探してください。

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

partialあなたが二回同じ関数定義を定義できません。オーバーライドまたは仮想化する必要がありますか、それが目的の場合は基本クラスで作業する必要があります。部分的には便利ですが、どのクラスがどこにあるのかわからない場合は、やや乱雑な解決策につながる可能性があります。

+1

同じ関数を部分クラスで2回定義することはできません。私はOPが望んでいると思います。 –

+0

同じ関数定義を2回探していればうまくいかないでしょう。あなたが探しているルートであれば、基本関数をオーバーライドする必要があります。私は私の答えにそのコメントを追加しました。ちょうど安全です。 – 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() {} 
} 
関連する問題