사이트에서는 부모창(aspx) 포함된 자식컨트롤(ascx) public 멤버에 접근할 있습니다.

그러나 반대인 ascx에서 부모창(aspx) 아예 접근조차 없습니다.

, ascx에서 aspx(클래스) 인스턴스를 만들 수가 없습니다.

(그러나 응용 프로그램 프로젝트에서는 가능합니다.)

페이지의 요청시 동적 컴파일 때문에 디자인 타임에서 다른 페이지(aspx ascx) 클래스를 참조할 없기 때문입니다.

대신, ascx aspx 상속 받는 Page클래스는 접근할 있습니다.

[상속 받는 클래스에는 접근할 있다] 것을 확장, 이용해서 aspx 인터페이스도 상속받게 해서, ascx 인터페이스를 이용해서 aspx 접근할 있는 방법을 생각해 있습니다.

인터페이스는 사실 이런 용도로 사용됩니다.

좀더 쉽게 설명하면, a(aspx),b(ascx)라는 사이에 어떤 약속(또는 규격) 정해 놓고 a 약속을 사용했다면 b 약속을 가지고 a 접근할 있는 것입니다.

여기서 약속이 인터페이스가 됩니다.

인터페이스는 선언과 구현으로 구분되는데, 선언은 class 선언처럼 interface 선언하고 함수나 속성,이벤트를 원형으로 선언합니다. 그리고 다른 클래스에서 이렇게 선언된 인터페이스를 사용하는 것을 구현이라고 하는데, 이때에는 원형으로 선언된 함수나 속성, 이벤트를 구체적으로 코드로 정의를 해줘야 합니다.

먼저 다음과 같은 WebForm1 클래스의 ResWrite함수를 자식컨트롤 ascx에서 호출하는 것을 가정합니다.

public partial class WebForm1 : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

}

void ResWrite()

{

Response.Write("Parent function!");

}

}

그리고 void형인 함수 ResWrite를 호출하기 위한 인터페이스를 만드는데, 웹사이트에서 인터페이스를 만드는 방법은 먼저 App_Code폴더에 클래스 파일을 만듭니다. 그리고 class 부분을 interface 바꿔주면 됩니다.

다음과 같이 인터페이스를 작성합니다.

public interface ICommonFunc

{

void ParentFunc();

}

ParentFunc함수가 WebForm1 클래스의 ResWrite함수를 호출하게 됩니다.

인터페이스에서 함수를 선언할 때는 public 붙여줘도 됩니다. 지정은 상속하는 클래스에서 합니다.

이제 WebForm1 클래스가 ICommonFunc 상속받는데, 다음과 같이 추가합니다.

public partial class WebForm1 : System.Web.UI.Page, ICommonFunc

그리고 ParentFunc 함수에서 ResWrite함수를 호출하는 구현을 합니다.

public void ParentFunc()

{

ResWrite();

}

처럼 함수 구현 부분을 직접 코딩해도 되지만, VS.NET 편집기에 인터페이스에 함수가 선언되어 있으면 자동으로 표기해 주는 편리한 기능이 있습니다. 인터페이스 이름 앞에 마우스를 갖다대면 다음과 같이 리스트 목록이 나오는데, 여기서 인터페이스 구현을 선택하면 선언된 함수가 자동으로 표기됩니다.

다음은 함수가 자동표기된 경우입니다.

throw~ 부분을 지우고 여기에 처리 로직을 구현하면 됩니다.

이제 자식 컨트롤에서 부모에 접근하는 방법은 인터페이스가 없으면 다음과 같이 하지만,

Page p=(Page)this.Parent.Parent;

인터페이스를 이용하면 다음이 가능합니다.

다음은 자식컨트롤 ascx에서 버튼을 클릭했을 , 부모의 ParentFunc함수를 호출하는 경우입니다.

protected void btnChild_Click(object sender, EventArgs e)

{

ICommonFunc icf = (ICommonFunc)this.Parent.Parent;

icf.ParentFunc();

}

위와 같이 ICommonFunc 인터페이스를 구현한 aspx 클래스들이 있다면 자식컨트롤 ascx에서 부모의 함수를 호출할 있게 되는 겁니다.

ICommonFunc 인터페이스를 구현하지 않은 aspx 클래스에서 ascx 사용하는 경우가 있다면, 다음과 같이 조금 안전하게 처리할 있습니다.

ICommonFunc icf = this.Parent.Parent as ICommonFunc;

if (icf != null)

{

icf.ParentFunc();

}

이렇게 하면, 부모에 인터페이스가 있을 때만 작동하게 되는 것이지요.

그리고 여기서 인터페이스를 사용하는 예는 부모에 있는 기존 함수를 호출하기 위한 것이고, 처음부터 인터페이스를 이용해서 설계한다면 다음과 같이 인터페이스 구현 함수 안에서 직접 로직 처리하면 됩니다.

public void ParentFunc()

{

Response.Write("Parent function!");

}

모든 aspx클래스가 ICommonFunc 인터페이스로 만족한다면 해피하겠지만, 어느 클래스는 이거 하나면 있으면 되고, 어떤 다른 클래스는 외에 다른 기능이 필요한 경우가 있습니다.

이때에는 기능만 구현하는 새로운 인터페이스를 만들어서 추가할 있습니다.

상속 지정부분에서 다음과 같이 새로운 인터페이스 ICommonExtra 추가합니다.

public partial class WebForm2 : System.Web.UI.Page, ICommonFunc, ICommonExtra

그리고 같은 방법으로 다음과 같이 ascx에서 접근할 있습니다.

ICommonExtra ice = this.Parent.Parent as ICommonExtra;

if (icf != null)

{

ice.ParentFunc2(); //ParentFunc2()가 구현되어 있다

}

보시는 바와 같이 인터페이스는 하나의 약속이기 때문에 접근하려는 쪽에서는 대상을 전부 필요가 없고, 인터페이스만 알고 있으면 됩니다.

그리고 주의할 점도 있는데요, 인터페이스에서 선언된 것들은 상속하는 클래스에서 반드시 모두 구현을 해줘야 합니다. 바꿔 말해서, 기존에 사용되고 있는 인터페이스에 새로운 함수 선언을 추가했다면, 이를 상속한 모든 클래스를 찾아서 함수 구현을 추가해줘야 합니다.

지금까지 인터페이스를 자식컨트롤(ascx) 부모창(aspx)에서 활용하는 예였습니다

'ASP.NET' 카테고리의 다른 글

Session 이야기  (0) 2008.10.22
Share session state between ASP and ASP.NET apps  (0) 2008.10.22
gmail 로 메일 보내기 ( .Net 2.0 버전 )  (0) 2008.10.08
DateTime 사용법  (0) 2008.06.25
VS 2008 웹 개발툴 핫픽스 롤업  (0) 2008.04.07
Posted by 퓨전마법사
,