เหตุผลหลัก: Interface เป็น Contract (สัญญา)
Interface กำหนด "ว่าต้องทำอะไรได้บ้าง" ไม่ใช่ "ทำอย่างไร"
- วัตถุประสงค์: ให้ Type อื่นเข้าถึง Class/Struct ผ่าน Contract นี้
- Member ทั้งหมดจึงเป็น Public โดยปริยาย (Implicitly Public)
- การใส่ Access Modifier จะขัดกับหลักการ "Public Contract"
ประวัติความเปลี่ยนแปลง
| Version | กฎ |
|---|---|
| C# 1.0 - 7.x | Member ใน Interface ห้ามมี Access Modifier (Error CS0106) |
| C# 8.0+ | อนุญาต private, protected, internal สำหรับ Default Implementation และ Static Members |
ตัวอย่าง C# 7.0 (Error)
interface IInterface
{
// ❌ Compile Error: The modifier 'public' is not valid for this item
public void Save();
// ✅ OK - Implicitly Public
void Save();
}
ตัวอย่าง C# 8.0+ (Valid)
interface IRepository<T>
{
// Public - Standard Contract
void Add(T entity);
T GetById(int id);
// Private - Helper สำหรับ Default Implementation
private void Validate(T entity) { ... }
// Protected - ให้ Derived Interface/Class ใช้ได้
protected virtual void OnBeforeSave(T entity) { }
// Internal - ใช้ภายใน Assembly เดียว
internal void InternalCleanup() { }
// Static Members (C# 8+)
static IRepository<T> CreateDefault() => new DefaultRepository<T>();
// Default Implementation (C# 8+)
public void AddRange(IEnumerable<T> entities)
{
foreach (var e in entities) Add(e);
}
}
Interface Access Modifiers (C# 8+)
| Modifier | ใช้ได้กับ | ความหมาย |
|---|---|---|
public | Members (Default) | ส่วนของ Contract สาธารณะ |
private | Methods, Static Members | Helper สำหรับ Default Implementation |
protected | Methods, Properties | เข้าถึงได้จาก Implementing Class |
internal | Members | เข้าถึงได้ใน Assembly เดียว |
protected internal | Members | Protected OR Internal |
private protected | Members | Protected AND Internal (Same Assembly + Derived) |
Interface Itself Access Modifier
Interface Declaration เองสามารถมี Access Modifier ได้:
// Namespace Level
public interface IPublicInterface { } // เข้าถึงได้ทุกที่
internal interface IInternalInterface { } // เข้าถึงได้ใน Assembly เดียว
// Nested Interface
public class Outer
{
private interface IPrivateInterface { } // เข้าถึงได้ใน Outer เท่านั้น
protected interface IProtectedInterface { } // Outer + Derived Classes
}
Best Practice
- ✅ Default: ไม่ใส่ Modifier (Implicitly Public) - Clear Contract
- ✅ C# 8+: ใช้
privateสำหรับ Helper Methods ใน Default Implementation - ✅ ใช้
internalสำหรับ Internal API - ❌ หลีกเลี่ยง
protectedใน Interface (ทำให้ Complex) - ❌ อย่าใส่
publicอย่างชัดเจน (Redundant, C# 7- Error)