문제

인터페이스가 있습니다 :

public interface Inx<T>
{
   T Set(Data data);
}

이 metod와의 간단한 클래스

public class Base
{
   ??? Set(Data data) { ... }
}

그리고 그런 부모 수업 :

public class Parent : Base, Inx<Parent>
{
   ...
}

어린이 수업에서 설정 메토드에서 부모 유형을 반환하고 싶습니다. 가능합니까? 나는 그런 일에해야합니다.

list.Add(new Parent().Set(data));

이제 그렇게해야합니다.

T t = new T();
t.Set(data);
list.Add(t);

그리고 그 작은 성가신, 나는 그것을 여러 번 사용해야합니다


스팸을 보내서 죄송합니다 흠 나는 그런 것을 사용할 수 있습니다.

this.GetType().GetConstructor(new System.Type[] { typeof(Data) }).Invoke(new object[] { data })

그래서 좋은 고집은이 방법에서 물체를 반환 할 것입니다. ?

일반적인 인터페이스를 가진 잘 일반적인 클래스는 큰 메모리 폐기물 인 것 같습니다 ...이 클래스의 Beacose 함수는 동일합니다.

도움이 되었습니까?

해결책

이것이 당신이 원하는 것입니까?

interface Inx<T> { 
    T Set(Data data);
}
public class Base
{
    public virtual T Set<T>(Data data)
    {
        T t = default(T);
        return t;
    }
}
public class Parent : Base, Inx<Parent>
{
    public Parent Set(Data data)
    {
        return base.Set<Parent>(data);
    }
}
class Program
{
    static void Main(string[] args)
    {
        var data = new Data();
        var list = new List<Parent>();
        list.Add(new Parent().Set<Parent>(data));
        // or 
        list.Add(new Parent().Set(data));
    }
}

편집 : Marc가 말한 것처럼 인터페이스 구현을 기본 클래스로 옮기는 것이 좋습니다.

interface Inx<T> { 
    T Set(Data data);
}
public class Base<T> : Inx<T>
{
    public virtual T Set(Data data)
    {
        T t = default(T);
        return t;
    }
}
public class Parent : Base<Parent>
{        
}
class Program
{
    static void Main(string[] args)
    {
        var data = new Data();
        var list = new List<Parent>();
        list.Add(new Parent().Set(data));            
    }
}

다른 팁

당신이 할 수있는 유일한 방법은 Base 제네릭 (Base<T>) 그리고 가지고 있습니다 Set 반품 T - 그럼 Parent : Base<Parent>. 문제는 ... 어떻게 될 것입니다 Set 만드는 방법을 알고 있습니다 T? 당신은 가질 수 있습니다 where T : new() 절...

여기에서 유용한 것은 인터페이스 구현을 Base<T>:

public class Base<T> : Inx<T> where T : new()
{
   public T Set(Data data) {
       T t = new T();
       ///
       return t;
   }
}
public class Parent : Base<Parent> { }

글쎄, 제네릭베이스 클래스를 사용한다면 부모 클래스를 한 유형으로 캐스팅 할 수 없습니다

도움을 받으려면 thx

interface Inx
{
   object Set(Data data);
}
class Base
{
   object Set(Data data)
   {
      // ...
      return (object) this;
   }
}
class Parent: Base, Inx
{
   // i don't have too write here Set (im using from base one)
}
class ManageParent<T> where T: Inx, new()
{
   // ...
      list.Add((T) new T().Set(data));
   // ...
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top