Как пропустить реализацию интерфейса в классе

#c# #oop #interface

#c# #ооп #интерфейс

Вопрос:

Интерфейс — I1 (содержит метод M1) Класс — C1:I1 (c1 реализует I1) Класс — C2: C1 (C2 наследует C1)

 interface I1
{
    void M1();
}
class C1 : I1
{
    void M1(){}
}
class C2 : C1
{
}
  

Требование:
В «C1» не должно быть никакой реализации «M1», в основном «M1» должен быть реализован в «C2»

Как добиться этого, используя любую из концепций OOPs?

Комментарии:

1. Я добавил схему вашей первой строки, которую легче понять (IMO), пожалуйста, не стесняйтесь изменять или возвращать назад, если вы не считаете, что это приемлемо

Ответ №1:

Пока вы можете терпеть абстрактность C1, это работает:

 interface I1
{
    void M1();
}

abstract class C1 : I1
{
    public abstract void M1();
}

class C2 : C1
{
    public override void M1()
    {
        //
    }
}
  

Редактировать: как отметил Исантипов в комментарии, вы можете избежать такого абстрактного класса:

 class C1 : I1
{
    public virtual void M1()
    {
        throw new NotSupportedException();
    }
}
  

Комментарии:

1. В случае, если вы не можете иметь c1 abstract, единственное, что вы можете сделать (помимо изменения вашей архитектуры, чтобы избежать наследования), это сделать M1 vertual и бросить NotSupportedExcetion ( msdn.microsoft.com/en-us/library /… ) в его реализации C1)

2. Спасибо, Дэвид, понял идею.

Ответ №2:

Сделайте C1 абстрактным и определите M1 как абстрактный метод.

Ответ №3:

Вы ищете абстрактный метод [wiki]:

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

Абстрактные методы в C #:

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

В вашем случае:

 interface I1
{
    void M1();
}

abstract class C1 : I1
{
    public abstract void M1();
}

class C2 : C1
{
    public override void M1()
    {
        // Your code here
    }
}
  

Ответ №4:

Вы можете либо сделать C1 абстрактным, либо использовать явную реализацию. Это означает, что он реализован, но его не видно.

 class C1 : I1
{
    void I1.M1(){ throw new NotImplementedException(); }
}
  

Недопустимо называть это так:

 C1 c1 = new C1();
c1.M1(); //Error
  

Ответ №5:

Альтернативный ответ.
У вас может быть несколько интерфейсов. Скрипка .NET

 interface I1 
{
   void someCommonMethod();
}

interface I2 
{
   void M1();
}
  

Тогда ваши классы могут наследоваться следующим образом.

 class C1 : I1
{
    public void someCommonMethod()
    {
        ...
    }
}

class C2 : C1, I2
{
    public void M1()
    {
        ...
    }
}