Класс расширяет абстрактный класс и реализует интерфейс - PullRequest
5 голосов
/ 25 апреля 2009

Что если у меня есть класс, который расширяет абстрактный класс и реализует интерфейс, например:

class Example : AbstractExample, ExampleInterface
{
    // class content here
}

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

Когда я делаю:

AbstractExample example = new Example();

Я не могу получить доступ к методам из интерфейса.

Ответы [ 5 ]

10 голосов
/ 25 апреля 2009

Вам нужно

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

Example example = new Example();

6 голосов
/ 25 апреля 2009

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

AbstractExample example = new Example();
((IExampleInterface)example).DoSomeMethodDefinedInInterface();

Ваши другие переменные должны иметь и AbstractExample, и IExampleInterface для реализации общего интерфейса, чтобы вы могли иметь, т. Е.

abstract class AbstractExample : ICommonInterface
interface IExampleInterface : ICommonInterface
class Example : AbstractExample, IExampleInterface

Теперь вы можете работать с ICommonInterface и иметь функциональность как абстрактного класса, так и реализации вашего интерфейса IExample.

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

5 голосов
/ 25 апреля 2009

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

private T SomeMethod<T>()
    where T : new(), AbstractExample, ExampleInterface
{
    T instance = new T();
    instance.SomeMethodOnAbstractClass();
    instance.SomeMethodOnInterface();
    return instance;
}
1 голос
/ 30 января 2013

Думаю, этот пример поможет вам:

public interface ICrud
{
    void Add();
    void Update();
    void Delete();
    void Select();
}

public abstract class CrudBase
{
    public void Add()
    {
        Console.WriteLine("Performing add operation...");
        Console.ReadLine();
    }

   public void Update()
    {
        Console.WriteLine("Performing update operation...");
        Console.ReadLine();
    }
    public void Delete()
    {
        Console.WriteLine("Performing delete operation...");
        Console.ReadLine();
    }
    public void Select()
    {
        Console.WriteLine("Performing select operation...");
        Console.ReadLine();
    }
}

public class ProcessData : CrudBase, ICrud
{

}

var process = new ProcessData();
process.Add();
1 голос
/ 25 апреля 2009

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

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, компилятор будет жаловаться.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...