У меня есть интерфейс:
public interface Inx<T>
{
T Set(Data data);
}
простой класс с этим методом
public class Base
{
??? Set(Data data) { ... }
}
и родительский класс:
public class Parent : Base, Inx<Parent>
{
...
}
Я хочу вернуть родительский тип из Set method в дочернем классе Возможно? Мне нужно, чтобы это было так:
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));
}
}
EDIT: лучше переместить реализацию интерфейса до класса Base, поскольку Марк сказал:
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
generic (Base<T>
) и иметь Set
return 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> { }
Хорошо, если я использую базовый базовый класс, я не могу отнести родительский класс к одному типу, я не знаю, почему я попробовал использовать общий там... я нашел решение сейчас:)
спасибо для справки
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));
// ...
}