2017-01-24 12 views
1

다음과 같이 내가 정의 된 개체가 :일반 객체에 대한 참조를 가져 <T>

public class ModelList<T> : ModelBase, IModelList<T>, IModelList 
where T : IModelListItem, new() 
{ 
    public void Method1() 
    { 
    // do work here! 
    } 
} 

public class Object1 : ModelListItem 
{ 
} 

public class Object2 : ModelListItem 
{ 
} 

public class Objects1: ModelList<Object1>, IModelList 
{ 
} 

public class Objects2: ModelList<Object2>, IModelList 
{ 
} 

을 어딘가에 코드에서 멀리 멀리 내가 Objects1 또는 Objects2 하나의 컬렉션 개체를 수신하는 방법이있다. 여기서 Method1을 호출 할 수있는 방법이 있습니까?

private void DoSomething(object O) 
{ 
    // O can be either Objects1 or Objects2 
    O.Method1(); 
} 
+0

처럼 사용할. – danny117

+0

@ danny117 : Java의 '구현'은 OP가 요구하는 것과 관련이 없다고 생각합니다. 'implements'으로 자바에서이 문제를 어떻게 해결할 수 있는지 보여줄 수 있습니까? –

+0

java에서는 클래스가 인터페이스를 구현하는지 확인할 수 있습니다. 그럴 경우 구현 된 메서드를 안전하게 호출 할 수 있습니다. 멀리 인터페이스가 구현되어 있는지 확인하면 메서드를 안전하게 호출 할 수 있습니다. – danny117

답변

2

때문에, 당신은 IModelListMethod1()을 추가하고 기능에 그것을 전달할 수 있습니다.

public interface IModelList 
{ 
    void Method1(); 
} 

자바에서 비슷한 일을해야합니다 구현의 C#을 확인할 수 있습니다

private void DoSomething(IModelList o) 
{ 
    // o can be either Objects1 or Objects2 or anything else that implments IModelList 
    o.Method1(); 
} 
+0

그것은 좋은 제안이지만 OP가'IModelList' 및 관련 유형을 제어하는 ​​경우에만 적용된다는 점에 유의해야합니다.그들이 지금 작성한 코드가 "멀리"라고 말하면서, 이것은 당연한 것으로 받아 들여질 수는 없다. –

+0

감사합니다. 인터페이스가 작동하는 방식을 바 꾸었습니다. 아직도 내 OOP 스킬 세트로 작업하고 있습니다. –

5

여기에서 방법 항목을 호출 할 수있는 방법이 있나요?

있다 : 당신의 멀리 방법은 일반적인 확인 :이 방법은 모든 유형에 의존하지 않는

private void DoSomething<T>(ModelList<T> o) 
    where T : IModelListItem, new() 
{ 
    o.Method1(); 
} 
+0

이것은 일반적인 방법인데,이 일반적인 DoSomething 메서드를 호출 할 때 Objects1 또는 Objects2를 적절한 형식으로 캐스팅하는 구문을 파악할 수 없습니다. –

+0

@NerdherderEd : 무엇이든 캐스팅 할 필요가 없습니다. 'DoSomething (new Objects1());'운이 좋다면 컴파일러는 타입 인자를 추론 할 수도 있습니다.이 경우에는 생략 할 수 있습니다 :'DoSomething (new Objects1()); ' –

+0

public void WorkOnCollection (object O)는 Objects1 및 Object2와 함께 작동하여 해당 컬렉션의 개체 유형을 알지 못합니다. Object1 또는 Object2 컬렉션 일 수 있습니다. 메서드 호출 DoSomething (O)은 VS2015의 인라인 컴파일러가 메시지를 짖지 않게합니다. 'DoSomething (ModelList )'은 사용법에서 유추 할 수 없습니다. 형식 인수를 명시 적으로 지정하십시오. –