Проблема с абстрактным классом, интерфейсом, контейнером и методами - PullRequest
0 голосов
/ 31 августа 2011

У меня следующий сценарий

У меня есть интерфейс

public interface ImyInterface
{
    void myInterfaceMethod(string param);
}

У меня есть абстрактный класс

public abstract class myAbstractClass
{
    public myAbstractClass()
    {
       //something valid for each inherited class
    }

    public void myAbstractMethod<T>(T param)
    {
      //something with T param
    }
}

У меня есть класс, который наследуется от myAbstractClass и реализует ImyInterface

public class myClass : myAbstractClass, ImyInterface
{
    public myClass():base()
    {}

    public void ThisMethodWillNeverCall()
    {
       // nothing to do
    }                    
}

И, наконец, у меня есть класс, в котором я создаю объект ImyInterface. В этот момент я бы назвал myAbstractMethod, но ...

public class myFinalClass
{
    public void myFinalMethod()
    {
       ImyInterface myObj = _myContainer<ImyInterface>();

       myObj.???

    }
}

Очевидно, что этого метода нет, потому что он не объявлен в интерфейсе. Мое решение следующее

public interface ImyInterface
{
   void myInterfaceMethod(string param);
   void myFakeMethod<T>(T param);
}

public class myClass : myAbstractClass, ImyInterface
{
   public myClass():base()
   {}

   public void ThisMethodWillNeverCall()
   {
      // nothing to do
   }

   //--- a fake method
   public void myFakeMethod<T>(T param)
   {
         base.myAbstractMethod<T>(param);
   }                    
 }

Есть ли другое решение лучше моего?

Спасибо!

1 Ответ

3 голосов
/ 31 августа 2011

Прежде всего, ваше соглашение об именах - беспорядок. Ознакомьтесь с рекомендациями , разработанными Microsoft.

На основе вашего примера также сложно сказать, чего вы пытаетесь достичь.

Вернуться к вашему вопросу:

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

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

...