Как я определяю тип возврата метода интерфейса быть другим интерфейсом?

Вы можете использовать маску , чтобы найти нужные записи

import datetime

df = pd.DataFrame([['1','2008-04-02','2008-07-10']], 
  columns=['license', 'issue', 'expire'])

parse_date = lambda x: return datetime.datetime.strptime(x, '%Y-%m-%d')

dt = parse_date('2008-06-01')

date_between = lambda x: parse_date(x['issue']) > dt and parse_date('expire') < dt

df = df[df.apply(date_between)]

. Таким образом, вы можете использовать список для сохранения результата:

s = []
for ds in active_day:
    dt = parse_date(ds)
    n = df[df.apply(date_between)].license.count()
    s.append((dt, n))

result_df = df.DataFrame(s, columns=['active_day', 'count'])

12
задан afuzzyllama 1 September 2016 в 15:19
поделиться

5 ответов

Вы должны к пользовательским дженерикам в C# 2 достигнуть этого:

public interface ICart<T> where T : ICartItem
{
    // ...
    List<T> CartItems { get; set; }
}

public abstract class Cart : ICart<CartItem>
{
    // ...
    public List<CartItem> CartItems { get; set; }
}
20
ответ дан 2 December 2019 в 05:15
поделиться

В Вашем абстрактном классе необходимо определить это тип возврата свойства CartItems, имеет тип List<ICartItem>.

Но, если Вы действительно хотите это, свойство имеет тип List<CartItem>, можно, возможно, сделать это:

public interface ICart<TCartItem> where TCartItem : ICartItem
{
   List<TCartItem> CartItems { get; set; }
}

public interface ICartItem
{
}

public abstract class Cart : ICart<CartItem>
{
     public List<CartItem> { get; set; }
}

public abstract class CartItem : ICartItem
{
}
4
ответ дан 2 December 2019 в 05:15
поделиться

Интерфейс является соглашением. Контракт, если Вы будете между Вами и кем-либо, кто использует Ваш класс. Путем сообщения людям, что Вы реализуете интерфейс ICart, Вы обещаете им, что все методы в интерфейсе существуют на Вашем классе. Таким образом все Ваши методы должны соответствовать подписям методов интерфейса.

Чтобы к возврату списка объектов, которые реализуют ICartItem, необходимо использовать дженерики, как предложено DrJokepu. Это говорит всем, что интерфейс только gurentees список объектов, которые реализуют ICartItem, не ICartItem конкретно.

public interface ICart<T> where T : ICartItem
{
    List<T> CartItems { get; set; }
}
2
ответ дан 2 December 2019 в 05:15
поделиться

Это - вопрос мятежника/ковариантности.

2 изменения требуются, чтобы делать эту компиляцию.

1) Удалите опцию "набора" на свойстве интерфейса. (Это только реализует получение; свойство, которое имеет большую часть смысла, в любом случае),

2) Корзина изменения к:

public abstract class Cart : ICart
{

private List<CartItem> _cartItems = new List<CartItem>();

public List<ICartItem> CartItems 
{ ...

Я также настоятельно рекомендую изменение Вашего интерфейса для представления IList вместо Списка. Руководство по проектированию (и FxCop) рекомендует не выставить Список в открытом интерфейсе. Список является деталью реализации - IList является соответствующим типом интерфейса/возврата.

3
ответ дан 2 December 2019 в 05:15
поделиться

ICart указывает метод считывания и метод set для CartItems, но Ваша реализация только имеет получение.

0
ответ дан 2 December 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: