2010-08-09 1 views
9

클래스의 인스턴스를 Java와 같이 C# /. net에 만들 수 있습니까? C#에서 익명 하위 클래스를 만드는 구문이 있습니까?

정보

추가

나는 우리의 많은 내가 무엇을 의미합니까 이해하지 못하는 것 같아? 그래서, 자바에서 나는 같은 추상 클래스를 만들 수 있습니다

간단한 추상 클래스 :

/** 
* @author jitm 
* @version 0.1 
*/ 
public abstract class TestAbstract 
{ 
    public abstract void toDoSmth(); 
} 

코드 내가

/** 
* @author jitm 
* @version 0.1 
*/ 
public class Main { 
    public static void main(String[] args) { 
     TestAbstract testAbstract = new TestAbstract() { 
      @Override 
      public void toDoSmth() { 
       System.out.println("Call method toDoSmth"); 
      } 
     }; 
    } 
} 

추상 클래스의 인스턴스를 생성 한 내가하기 위해 할 수있는 C#에서 이렇게할까요?

+6

현재 귀하의 질문은 너무 멀리 있습니다. 특히 제목과 태그에서 추상 클래스를 언급했지만 텍스트 본문에서는 언급하지 않았습니다. 특정 Java 코드를 염두에 둔 경우 게시하십시오. –

+1

그는 "Abstact"라는 수업을 언급했다. 관련성이있을 수 있습니다. –

+0

아니요, Abstract 클래스는 abstract와 같습니다. – jitm

답변

8

Java 나 C#에서는 추상 클래스의 인스턴스를 만들 수 없습니다. 항상 추상 클래스에서 상속받은 구체적인 클래스를 만들어야합니다. Java를 사용하면 익명 클래스를 사용하여 클래스의 이름을 지정하지 않고도 작업을 수행 할 수 있습니다. C#은 그 옵션을 제공하지 않습니다.

당신이 추상 클래스를 사용할 때 자바에서 일반적으로

을 (.이 컴파일되지 않을 수도 있습니다 내가 여기 VS에 액세스 할 수없는, 그러나 이것은 아이디어 교환 등의 대리자를 보여 수정 됨) 단일 추상 메서드 (SAM) 당신이 실제로 달성하려고하는 것은 매개 변수로 일부 코드를 전달하는 것입니다. 컬렉션을 사용하여 클래스 이름을 기반으로 객체 배열을 정렬해야한다고 가정 해 보겠습니다.종류 (컬렉션, 비교기) 추가 입력을 방지하기 위해 익명 클래스를 사용 (나는 비교기는 인터페이스 알고 있지만,이 같은 생각입니다) , 당신은 C#을 2.0에서하고 넘어

Comparator<Object> comparator = new Comparator<Object>{ 
     @Override 
     public int compare(Object o1, Objecto2) { 
      return o1.getClass().getSimpleName().compareTo(o2.getClass().getSimpleName())); 
     }//I'm not checking for null for simplicity 
    } 
    Collections.sort(list, comparator) 

같은 것을 쓸 수 있습니다 Comparison<T> 대리자를 사용하면 거의 동일하게 처리 할 수 ​​있습니다. 델리게이트는 함수 객체 또는 자바에서 단일 메소드를 가진 클래스로 생각할 수 있습니다. 클래스를 만들지 않아도되지만 delegate 키워드를 사용하는 메서드 만 만들면됩니다. C#을 3.0에서 당신은 람다 및 형식 유추를 사용하여 더 적은 코드를 작성할 수 있습니다 이상

Comparison<Object> comparison = delegate(Object o1, Object o2) 
{ 
    return o1.class.Name.CompareTo(o2.class.Name);   
}; 

list.sort(comparison); 

: 당신은 C#을에 코드 형태로 자바를 마이그레이션하는 경우

list.sort((o1, o2) => o1.class.Name.CompareTo(o2.class.Name)) 

어쨌든, 당신이 대표에 대해 읽어야 ... 대부분의 경우 익명 클래스 대신 대리자를 사용합니다. 귀하의 경우 void toDoSmth() 메소드를 사용하고 있습니다. 액션이라고하는 델리게이트가 있습니다. 이것은 매개 변수가없고 반환이없는 메소드와 거의 같습니다.

+0

예, 제 질문은 자바 (익명 사용)와 같은 인스턴스를 만들 수 있습니까? 현재는 이해할 수 없습니다. 감사합니다. . – jitm

+2

일부 경우 (대부분의 경우) 익명 클래스를 델리게이트로 대체해야하며 적은 수의 코드를 작성할 것입니다. 특히 하나의 메소드 클래스가 있습니다. –

+0

2 Pablo : 예제를 게시하는 방법을 게시 할 수 있습니까? 왜냐하면 현재 추상에서 간단한 클래스를 작성하여 사용했기 때문입니다. – jitm

8

아니요. 직접적으로 아닙니다. 가장 가까운 당신이 (당신이 다음 클래스 구조를 가지고 가정) 올 수 있습니다 :

public abstract class AbstractClass 
{ 
} 

public class ChildClass : AbstractClass 
{ 
} 

은 다음과 같습니다, 대답이없는

AbstractClass instance = new ChildClass(); 
0

당신이 추상 클래스에 대해 이야기하는 경우입니다. 그들은 거의 인터페이스처럼, 나중에 구체적인 객체로 사용할 수 있습니다 구현 .. 당신은

참조 추상 클래스에서 상속 구체적인 클래스를 작성해야 할 수 Abstract Classes

+0

.NET 1.1 링크를 게시하지 마십시오! –

0

더 아니, 당신은 할 수 없습니다 - 이것이 클래스를 추상이라고 부르는 이유입니다. 당신은 그것으로부터 파생 될 수 있고 당신이 인스턴스화 할 수있는 구체적인 구현 클래스들을 생성 할 수 있습니다.

0

당신이 묻는 것은 조금 혼란 스럽습니다. 클래스의 인스턴스를 만들 수 있는지 묻는다면 당연히 할 수 있습니다. 왜 C#이나 다른 언어로도 클래스를 정의 할 수 있지만 인스턴스화 할 수는 없습니까?

추상 클래스의 인스턴스를 만들 수 있는지 묻는다면 대답은 아니오입니다. 추상 클래스에서 새 클래스를 파생시킨 다음 새 클래스를 인스턴스화해야합니다.

-1

C#은이 경우 Java와 동일하므로 추상 클래스를 인스턴스화 할 수 없습니다.

+0

자바에서는 내가 할 수있는 것은 추상적 인 메소드 만 구현하면되지만, 익명 구현과 같이 할 수있다. – jitm

+0

그 경우에는 - C# (내가 아는 한 추상 클래스의 익명 구현을 만들 수 없습니다). – RQDQ

+0

여전히 추상 클래스를 인스턴스화하지 않고 익명 하위 클래스를 인스턴스화합니다. – Struan

관련 문제