2012-09-24 3 views
1

블록 외부에서 사용할 수 있도록 블록 또는 함수 내부의 객체를 초기화 할 수 있습니까?블록 외부에서 객체의 범위 만들기

if(a==b) 
{ Type1 obj = new Type1();} 
else 
{Type2 obj = new Type2();} 

obj.getFunction(); 

I가 기본 클래스 USER 파생 된 클래스 ADMIN이 그 동안 사용자의 역할에 따른 오브젝트를 생성 할 필요 : 여기

타입 2는 예를 들면 타입 1

로부터 파생 클래스 로그인하고 그 개체를 나중에 사용하므로 매번 사용자의 역할을 확인할 필요가 없습니다. (초보자)

이 것이 가능한가 ??

답변

5

(존 소총의 대답 (경기장에서 최고의 선수 단계) ...를 참조 하지 않는 한) 변수는 한 종류 또는 다른이 될 수 있습니다 - 컴파일러는 이후 수 있도록 어떤 멤버 액세스 알게 될 것입니다 그렇지 않으면 방법 ?

변수의 타입이어야 일반적인 기본 유형 function을 선언 (기본 클래스 또는 인터페이스)가 있다면 :

BaseType obj; 
if (a == b) 
{ 
    obj = new Type1(); 
} 
else 
{ 
    obj = new Type2(); 
} 
obj.Function(); // Name fixed to follow conventions 

이 간단 것뿐만 :

BaseType obj = a == b ? (BaseType) new Type1() : new Type2(); 
obj.Function(); 

하는 경우 그들은 입니다. 실제로 다른 유형입니다. 따라서 완전히 다른 메소드를 호출하는 경우 각 블록 내에서 변수를 선언해야하며 당신은 C# 4 이상을 사용하는 경우이 메소드를 호출하거나, 나중에 동적 입력을 사용할 수 있습니다

dynamic obj = a == b ? (dynamic) new Type1() : new Type2(); 
obj.Function(); 

당신은 정말이 진정으로-공통 기능인지에 대해 생각하려고해야하는 경우 그것 기본 유형에서 선언해야한다, 또는 당신이 동일한 이름을 가진 2 개의 기능을 가지고있는 다만 우연한 일치 인 경우에, 그 (것)들을 대우하는 것을 시도하는 것은 나쁜 생각이다.

+0

Type1과 Type2가 BaseType에서 상속되어야한다는 것을 의미합니까 ?? – Hybridzz

+1

@Hybridzz : 잠재적으로 그렇습니다. 당신은 정말로 우리에게 충분한 정보를주지 않았습니다. –

+0

ok .. 당신을 줄 것입니다. – Hybridzz

5

왜 범위에서 함수를 실행하지 않습니까? 범위를 벗어나는 변수는 액세스 할 수 없습니다.

if(a==b) 
{ 
    TYPE1 obj = new TYPE1(); 
    obj.function(); 
} 
else 
{ 
    TYPE2 obj = new TYPE2(); 
    obj.function(); 
} 
+0

나중에 사용해야합니다 .. – Hybridzz

+0

@Hybridzz : ** 왜 ** 나중에 사용해야합니까? 기본적으로 상황에 대한 충분한 정보를 제공하지 않았습니다. http://tinyurl.com/so-hints –

+0

을 읽으십시오. 편집했습니다. – Hybridzz

5

우리가 블록 또는 함수 내에서 변수를 만들 수 (... 당신은 예를 들어, 메소드 이름을 변경 한 종류의 리팩토링 상상) 그것의 블록 외부에서 사용할 수 있도록 (전에 그것을 를 선언하지 않고) 너무...?

아니요. 그렇게 할 수 없습니다. 외부 변수에 액세스 할 수 있도록 블록 외부에서 변수를 정의해야합니다.

+0

괜찮 았나, 어떻게 고마워요 4U 대답 – Hybridzz

+1

@Hybridzz, 나중에 그것을 사용하는 블록 외부의 변수를 정의해야합니다, 그렇지 않으면 그게 불가능합니다. – Habib

관련 문제