Вот простой класс и производный класс:метод, который возвращает экземпляр подкласса
class A { public int val; }
class B : A { }
Я хотел бы метод Inc
, который работает на обоих A
и B
экземпляров, которая возвращает новый экземпляр с val
увеличивается на 1 .
Одним из способов решения этой проблемы является определение Inc
как метод расширения:
static class Extensions
{
public static T Inc<T>(this T obj) where T : A, new()
{
return new T() { val = obj.val + 1 };
}
}
Это похоже на работу. В следующем примере a0.val
- и b0.val
- .
var a = new A() { val = 10 };
var b = new B() { val = 20 };
var a0 = a.Inc();
var b0 = b.Inc();
Мой вопрос, есть ли способ определить Inc
в качестве прямого члена A
и она работает, как описано выше?
Если я определяю A
так:
class A
{
public int val;
public T Inc<T>() where T : A, new()
{
return new T() { val = val + 1 };
}
}
затем нужно квалифицировать тип, когда я звоню Inc
:
var a = new A() { val = 10 };
var b = new B() { val = 20 };
var a0 = a.Inc<A>();
var b0 = b.Inc<B>();
Есть ли способ, чтобы идти по пути метода член без квалифицировать тип?
Ожидаете ли вы 'var b0' -' B b0', или вы в порядке с 'A b0'? Если более поздний клон-раствор будет носителем, вероятно, вы хотите.Я не думаю, что вы можете добиться надежного 'B b0' (см. Комментарий p.s.w.g к RagtimeWilly's [ответ] (http://stackoverflow.com/a/29158330/477420)). –
@AlexeiLevenkov результат 'b.Inc()' должен быть типа 'B' – dharmatech
Рассмотрите возможность редактирования сообщения с этой важной частью информации ... И выясните, что вы ожидаете от' A b = new B {val = 20 }; ??? b0 = b.Inc(); ' –