2012-06-29 2 views
1

나는 구현보다는 인터페이스로 코딩하는 습관을 얻으려고 노력하고 있으며, 대부분의 경우에 내가 투쟁하는 곳이 몇 가지 있다는 것을 알 수있다.구현 혼란이 아닌 인터페이스에 대한 프로그램

public partial class AuditLogPage : System.Web.UI.Page 
{ 
    protected void btnAddLog_Click(object sender, EventArgs e) 
    { 
     IAuditLog objAuditLog = new AuditLog(); 
     objAuditLog.AddLog("test log"); 
    } 
} 
인스턴스화 할 때 나는 아직도 AuditLog 보고서를 사용할 필요가

, 그래서 점은 무엇입니까 :

public interface IAuditLog 
{ 
    void AddLog(string log); 
} 

public class AuditLog : IAuditLog 
{ 
    public void AddLog(string log) 
    { 
     //implementation 
    } 
} 

는 감사 로그 클래스를 호출하려면 다음

이 정말 간단한 예제를 가지고? AddLog 메서드의 시그너처가 변경되면 코드를 사용하고 코드를 수정하는 모든 페이지를 계속 검토해야합니다. 요점을 놓치고 있습니까?

사전에 도움을 주셔서 감사합니다. Wilky.

답변

4

두 AuditLog 보고서 클래스

class AuditLogToDatabase : IAuditLog // writes to database 

다른이가 당신이 실행에 약간의 구성에 따라 어떤 클래스를 삽입 할 수

class AuditLogToFile : IAuditLog // writes to file 

지금

protected void btnAddLog_Click(object sender, EventArgs e) 
{ 
    IAuditLog objAuditLog = AuditLogFactory.GetAuditLog(); 
    objAuditLog.AddLog("test log"); 
} 

처럼되어 있다고 가정 해 봅시다 실제 구현을 바꾸지 않고도 시간을 바꾼다.

+1

귀하의 솔루션에 공장을 추가 할 수 있습니다 ... –

+0

감사 Asif. 완벽하게 이해합니다. – Wilky

3

이것은 실제로 C# interface을 사용해야한다는 것을 의미하지는 않습니다. OOP 용어의 인터페이스는 공개적으로 표시되는 API의 façade입니다. 계약이며 외부에서 볼 수있는 작업 결과를 지정해야합니다. 표면 아래에서 정확하게 작동하는 방법은 관련성이 없어야하므로 언제든지 구현을 바꿀 수 있습니다.

당연히 interface은 다른 구현을 사용할 수있는 방법이지만 다른 추상 클래스도 파생 될 수있는 비 추상적 클래스입니다.

그러나 질문의 ​​정확한 지점 : 물론 클래스를 인스턴스화 할 때 유형을 알고 있어야하지만 반드시 클래스 인스턴스를 생성 할 필요는 없습니다. IAuditLog을 바깥에서 설정하거나 코드의 정확한 지점에서 알 수없는 팩토리 클래스 (예 : IAuditLog과 호환 됨)를 통해 가져올 수 있습니다.

+0

+1 : 퀘스트의 본질에 대한 유일한 답 에 – Vlad

5

FileAuditLogger()DatabaseAuditLogger() 또는 EventLogAuditLogger()으로 전환 한 경우 코드를 다시 작성하지 않고도 구현을 전환 할 수 있습니다.

일반적으로 IoC 컨테이너 (Autofac, StructureMap, Unity 등)를 사용하여 객체 인스턴스화를 자동으로 연결합니다. 따라서 new AuditLog()으로 전화하시는 대신 IoC.Container.Resolve<IAuditLog>()

자세한 정보를 원하시면 알려주십시오.

1

이 메서드는 Factory 메서드와 같은 메서드에서 AuditLog 인스턴스를 만들고 IAuditLog 인터페이스에서 파생 된 클래스가 둘 이상인 AuditLogXXX 인 경우 실제로 유용합니다.

그래서,이 코드를 사용하여 대신 :

IAuditLog objAuditLog = new AuditLog(); 

당신이 인터페이스에 프로그래밍 할 때 당신은 실제로이 코드를 사용합니다 :

IAuditLog objAuditLog = LogFactory.GetAuditLog(); //This call is programmed to an interface 

GetAuditLog()LogFactory에 정의 된 인터페이스 입력 방법 클래스 :

class LogFactory 
{  
    public IAuditLog GetAuditLog() // This method is programmed to an interface 
    { 
     //Some logic to make a choice to return appropriate AuditLogXXX instance from the factory 
    }  
} 
+0

모두 감사합니다 !! – Wilky

관련 문제