Как определить класс с интерфейсом так, что бы он имел методы интерфейса, но без их реализации

138
08 февраля 2021, 06:20

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

Я где-то видел такое решение. но вспомнить не могу. Там на дженериках все было завязано, in, out как параметр типа, вроде бы имьютейбл или что то такое.

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

Уточнение №2: что то на подобии перегрузки оператора -> в C++, т.е. в C++ можно поместить указатель на структуру/класс, и перегрузив оператор -> должным образом, работать с указателем на некий класс, а не с тем классом, контейнером которого является.

Пример:

ISomeInterface
{
    void SomeMethodInterface(int someParam);
}
public SomeClass
{
    private ISomeInterface _instance;
}

Теперь если обратиться к классу SomeClass, я хочу получить методы интерфейса ISomeInterface, при этом отдавать ссылку на ISomeIntarface нельзя.

Важно понимать тот факт, что ни один класс не должен наследоваться от интерфейса.

Answer 1

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

Вот это не вкурил вообще что нужно.

Но если читать только сам заголовок....

Как определить класс с интерфейсом так, что бы он имел методы интерфейса, но без их реализации

Сделать класс абстрактным и метод с интерфейса абстрактным:

interface ITest
{
    void TestMethod(int a, int b);
}

abstract class TestAbstract : ITest
{
    public abstract void TestMethod(int a, int b);
}

Все что ты просил солюдено: есть метод, нет имплементации тела.

но не уверен это ли ты вообще хотел...

Так же стоит добавить то, что в C#8 появится возможность писать интерфейсы с реализацией:

interface IDisplayService
{
    void DisplayMessage(string message) 
    {
        WriteLine(message); 
    }
}

т.е. если использовать восьмерку, то что реализацию что ее отсутствие можно будет сделать в рамках одного лишь интерфейса.

Answer 2

Можно использовать методы расширения для интерфейсов.

interface IFoo
{
}
class Foo : IFoo
{
}
static class Extension
{
    static public int DoWork(this IFoo foo, int n)
    {
        return n * 2;
    }
}

Используем:

var foo = new Foo();
var result = foo.DoWork(5);
Console.WriteLine(result); // 10

Подходит?

Answer 3

Это невозможно в общем случае.

Ну и непонятно, почему вы не хотите написать просто явно:

public SomeClass
{
    private ISomeInterface _instance;
    public void SomeMethodInterface(int someParam)
    {
        ...
    }
}

?

READ ALSO
Исключить из коллекции элементы input type=“hidden”

Исключить из коллекции элементы input type=“hidden”

На сайте есть 6 видимых и 2 невидимых поляМне необходимо добавить в коллекцию только видимые

136
как прочесть в c# XML документ? [дубликат]

как прочесть в c# XML документ? [дубликат]

Уважаемые знатоки! как на СиШарпе, прочитать ХМЛ файл такого рода:

147
Модификаторы virtual и override

Модификаторы virtual и override

Пусть имеется 3 класса A B и CB наследуется от А, а C в свою очередь от B, следовательно B получит всё что есть у A, а C получит всё от A и B

153