Класс и расширяет абстрактный класс и реализует интерфейс

Это потому, что x_ представляет собой список списков:

>>> x_
[[1.0, 1.0, 1.0], [1.0, 1.0, 1.0]]

Таким образом, замените строку x_=[c_,d_] на:

>>> x_ = c_ + d_

Вам также придется изменить свой hamiltonian для списка 1xN или Nx1 / массива.

Самый простой взлом, который я могу придумать:

def hamiltonian(x_):
    N=len(c_)
    if type(x_[0]) == np.array:
        x_ = np.concatenate((x_[0:N], x_[N:]), axis=0)
    return np.sum([(1/n**3.0)*(n-i)*i*(x_[0][(n-i)]*x_[0][i]+x_[1][(n-i)]*x_[1][i])-(1/n**3.0/alpha**2.0)*np.sum([x_[0][(n-i-j)]*x_[0][i]*x_[1][j] for j in range(0,(n-i+1))])  for n in range(1,N) for i in range(0,(n+1))])
5
задан abatishchev 17 February 2015 в 03:30
поделиться

4 ответа

Последний пример свяжет вас с солидным экземпляром интерфейса или абстрактного класса, который, как я полагаю, не является вашей целью. Плохая новость в том, что вы НЕ используете язык с динамической типизацией, так что вы застряли либо со ссылкой на сплошные объекты «Пример», как это было ранее прорисовано, либо с приведением / отменой вещания, т.е. вы можете работать с ICommonInterface и иметь функциональность как абстрактного класса, так и реализации вашего интерфейса IExample.

Если ни один из этих ответов не приемлем, возможно, вы захотите взглянуть на некоторые языки DLR, которые работают в среде .NET, например IronPython.

6
ответ дан 18 December 2019 в 06:51
поделиться

Вам необходимо

  • реализовать интерфейс в AbstractExample
  • или получить ссылку на Example

Пример example = new Example ();

10
ответ дан 18 December 2019 в 06:51
поделиться

Если вы знаете только абстрактный класс, это предполагает, что вы знаете фактический тип через экземпляр типа . Следовательно, вы можете использовать обобщенные значения:

private T SomeMethod<T>()
    where T : new(), AbstractExample, ExampleInterface
{
    T instance = new T();
    instance.SomeMethodOnAbstractClass();
    instance.SomeMethodOnInterface();
    return instance;
}
5
ответ дан 18 December 2019 в 06:51
поделиться

Использование:

Example example = new Example();

Обновлено после получения дополнительной информации:

Если вы уверены, оно реализует ExampleInterface, вы можете использовать

AbstractClass example = new Example();
ExampleInterface exampleInterface = (ExampleInterface)example;
exampleInterface.InterfaceMethod();

. Вы также можете убедиться, что это действительно реализует его, проверяя интерфейс с помощью

if (example is ExampleInterface) {
    // Cast to ExampleInterface like above and call its methods.
}

. ​​Я не верю, что Generics поможет вам, поскольку они разрешены во время компиляции, и если у вас есть только ссылка на AbstractClass, компилятор будет жаловаться.

Редактировать: Так более или менее то, что Оуэн сказал. :)

1
ответ дан 18 December 2019 в 06:51
поделиться
Другие вопросы по тегам:

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