| 術語 | 定義 |
|---|---|
| 巢狀類型 | 類別完整定義在另一個類別內部 (Inner Class) |
| 包含類型 | 一個類別包含另一個類別型別的資料成員 (Composition) |
class Container
{
class Nested // 預設 private
{
Nested() { }
}
public class PublicNested // 可設為 public/protected/internal
{
PublicNested() { }
}
}
private,外部類型不可存取public、protected、internal、protected internal、privateContainer.Nestedvar n = new Container.Nested(); (public 時)
public class Container
{
private string _name = "Outer";
public class Nested
{
private Container _parent;
public Nested() { }
public Nested(Container parent) => _parent = parent;
public void PrintParentName() => Console.WriteLine(_parent._name); // 存取 private
}
}
類別 A 有一個類別 B 型別的私有欄位,A 的實例「包含」B 的實例。
public class Aaa
{
private string _val1;
public Aaa(string str) => _val1 = str;
public string Val1 { get => _val1; set => _val1 = value; }
}
public class Bbb
{
private Aaa _bval1; // 包含 Aaa 型別的私有成員
public Aaa Bval1
{
get => _bval1;
set => _bval1 = value;
}
}
// 使用
Bbb bb = new Bbb();
bb.Bval1 = new Aaa("abc123");
Console.WriteLine(bb.Bval1.Val1); // 輸出: abc123
public class Container
{
private string _containerData = "Container Data";
public class Nested
{
private Container _parent;
public Nested() { }
public Nested(Container parent) => _parent = parent;
public void AccessContainerPrivate()
{
if (_parent != null)
Console.WriteLine(_parent._containerData); // 合法存取 private
}
}
public void Demo()
{
var nested = new Nested(this);
nested.AccessContainerPrivate();
}
}
// 外部使用
Container c = new Container();
c.Demo(); // 輸出: Container Data
// 直接建立巢狀實例 (需 public)
Container.Nested n = new Container.Nested();
巢狀類型提供封裝與存取外部私有成員的能力,適合實作細節隱藏;包含類型是標準物件組合方式。理解兩者差異,依領域模型需求選擇。