2014-09-28 2 views
0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace DesignPatterns 
{ 
    public class Composite 
    { 
     public Composite() 
     { 
      Console.WriteLine("I am Composite class constructor"); 
     } 

     public void add() 
     { 
      Console.WriteLine("Added to Composite class"); 
     } 
    } 

    public class Component 
    { 
     public Component() 
     { 
      Console.WriteLine("I am Component class constructor"); 
     } 

     public void add() 
     { 
      Console.WriteLine("Added to Component class"); 
     } 
    } 
} 

위 코드에서 추가 기능을 호출하려고합니다. 나는 인터페이스를 사용하고 싶지 않다.C에서 매개 변수로 제네릭 사용 #

이것은 컴파일러 오류입니다. 이 방법으로 가능하지 않다면 여기 클래스 인스턴스을 어떻게 사용합니까? (인터페이스와 비슷한 제네릭을 사용하려고했습니다). 가능하지 않다면 매개 변수로 제네릭을 사용하는 것이 무엇입니까?

+1

:

그런 다음 당신은 일을 액세스하기 위해 인터페이스를 사용할 수 있을까? 대안 (공유 된, 아마도 추상적 인 기본 클래스 사용)은 사실 더 많은 방해물입니다. –

+0

@ FrédéricHamidi, 나는 단지 제네릭을 배우려고 노력하고 있습니다. 따라서 제네릭을 메서드의 매개 변수로 사용하는 것이 무엇인지 알아 내려고합니다. (어떻게 여기에 클래스 인스턴스를 사용할 수 있습니까?) – SHRI

+1

글쎄, 적절한 대답이 될 것입니다. * 일반적인 메소드 매개 변수는 여기에 필요하지 않습니다. (실제로 그런 식으로 사용되는 것은 아닙니다) *. 일반적인 메서드 매개 변수는 메서드에서 generic * types * (* Enumerable.Select() (http://msdn.microsoft.com/en-us/library/vstudio/bb548891.aspx) 예제 참조)를 가져 오거나 반환 할 때 실제로 빛납니다.). –

답변

2

는 컴포지트 및 컴포넌트가

public interface IMyI 
{ 
    void add(); 
} 

당신의 두 개의 클래스가 나는 또한 강하게 당신에게 제공하여 인터페이스와 유사한 솔루션을 조언 할

public void Add<T>(T classinstance) where T : IMyI 
{ 
    Console.WriteLine("Added " + classinstance + " to the Examp class"); 
    classinstance.add(); 
} 
+4

여기에있는 간단한 예제에서,'Add (IMyI)'는 똑같은 기능을 제공하지만 더 간단합니다. –

+0

@TimS. 사실, 고마워. 나는 당신의 제안을 어디에서 사용할 수 있는지 보여주기 위해 노력했지만 – artm

+2

@artm 제 편집 내용을 되돌릴 이유가 확실하지 않지만 generic 형식에서'add'를 호출 할 수 없습니다. 'T'는 타입이므로,'add'는 그 타입의 정적 메소드 일 필요는 있지만 generic 타입은 정적 메소드를 가질 수 없습니다. – poke

2

에 Examp.Add을 IMyI을 구현하고 변경할 인터페이스를 구현합니다 @artm. 당신이 정말로 인터페이스를 사용하지 않으려면, 당신은 dynamic 매개 변수를 사용하고 Examp 클래스에 Add 방법을 변경할 수 있습니다

public void Add(dynamic classinstance) 
{ 
    Console.WriteLine("Added " + classinstance + " to the Examp class"); 
    classinstance.add(); 
} 
0

것은 당신이 인터페이스를 사용하지 않으려면, 당신의 Add 방법은 실제로 단지 무언가를

public void Add (Composite classinstance) 
{ 
    Console.WriteLine("Added " + classinstance + " to the Examp class"); 
    classinstance.add(); 
} 

public void Add (Component classinstance) 
{ 
    Console.WriteLine("Added " + classinstance + " to the Examp class"); 
    classinstance.add(); 
} 

을하지만, 예를 들어, 뭔가 컬렉션을 이러한 개체를 추가하려는 경우, 당신은 확실히, 예를 공통 기본 유형을 사용해야처럼, 당신은 또한 단지 두 종류의 과부하를 제공 할 수 다른 사람들이 제안한 것처럼 인터페이스를 추가하여 정보를 추가하지 않고도 유형을 유지할 수 있습니다 (object). 왜 인터페이스를 사용하지 않으려는

private List<IAddable> list = new List<IAddable>(); 

public void Add (IAddable obj) 
{ 
    Console.WriteLine("Added {0} to the Examp class", obj); 
    list.Add(obj); // actually add the object to some collection 
    obj.add(); 
} 
관련 문제