異なる名前空間に部分クラスを作成できますか?正しく動作しますか?例:
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
は2つの完全に独立したタイプです。あなたの質問に対する短い答えは:いいえ。
なぜこのようなことをする必要があるのですか?
部分クラスは同じ名前空間と同じアセンブリでのみ可能です。
名前空間は2つの異なるアセンブリに存在できますが、部分クラスは存在できません。
部分クラスを実装する際に考慮すべき点がいくつかあります:-
部分クラスの各部分で部分キーワードを使用します。
部分クラスの各部分の名前は同じである必要がありますが、部分クラスの各部分のソースファイル名は異なっていてもかまいません。
部分クラスのすべての部分は同じ名前空間にある必要があります。
部分クラスの各部分は同じアセンブリまたは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();
}
}
}
おそらく、いくつかのヘルパー/ utilsクラスに対してこれを行うことは問題ありません。しかし、他の人が気づいたように、部分クラスは方法ではありません。
MSDNの部分的なクラスおよびメソッドの制限 https://msdn.Microsoft.com/en-us/library/wa80x488.aspx