2017-01-13 2 views
-2

У меня возникла проблема с использованием методов интерфейса в моем объекте. Я просто даю вам пример без всех дополнений.Интерфейс C# и наследование классов

public class Item{} 
public interface IFruit 
{ 
     void MethodExample(); 
} 

public class Apple : Item, IFruit 
{ 
    public void IFruit.MethodExample(){} 
} 

// put this in a run method somewhere 
var example_item = new Apple(); 

//Here comes the problem. 
example_item.MethodExample(); 
// this will return an error saying that it cant find the method. 

В любом случае, чтобы это сделать? Я знаю, что он реализует i_fruit. И имеет метод. Но я не могу его получить?

+4

Какой язык программирования это? Ваш вопрос помечен 'C#', но то, что вы показали в своем вопросе, - это нечто иное. –

+4

Если это C#, то я удивлен, что вы не получаете ошибку для 'method'. Кроме того, проверьте заглавные буквы на имена методов. –

+0

Это C#, уверяю вас. Я просто написал метод, чтобы показать, что это метод, не заботящийся о возврате. Притворитесь, что вместо void вместо void – Mdsm

ответ

0

в синтаксис в приведенном примере не похож на C#, но вот простой пример, похожий на ваш. Элемент класса не имеет метода ExampleMethod, но Apple делает это, потому что он реализует интерфейс IFruit. Однако вы можете использовать ключевое слово as, чтобы временно временно передать объект во что-то еще и тем самым получить доступ к ExampleMethod. Обычный способ справиться с этим типом ситуации показан в примере с exampleFruit. Надеюсь это поможет.

using System; 

namespace StackOverflowInterfaces 
{ 
    class Item { } 
    interface IFruit 
    { 
     void ExampleMethod(); 
    } 

    class Apple : Item, IFruit 
    { 
     public void ExampleMethod() 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    class MainClass 
    { 
     public static void Main() 
     { 
      Item exampleItem = new Apple(); 
      // exampleItem.ExampleMethod(); -- DOES NOT WORK, because Item does not implement IFruit 
      (exampleItem as IFruit).ExampleMethod(); 
      (exampleItem as Apple).ExampleMethod(); 

      IFruit exampleFruit = new Apple(); 
      exampleFruit.ExampleMethod(); 

      Apple exampleApple = new Apple(); 
      exampleApple.ExampleMethod(); 

     } 
    } 
} 
+0

Спасибо. Это то, что мне нужно – Mdsm

5

Прежде всего, пожалуйста, ознакомьтесь с соглашениями об именах C#. Во-вторых, вы внедрили интерфейс i_fruit явно, вы должны наложить example_item на i_fruit, или более распространенным способом является реализация интерфейса i_fruit неявно. Пожалуйста, прочитайте: https://blogs.msdn.microsoft.com/mhop/2006/12/13/implicit-and-explicit-interface-implementations/

неявной пример реализации:

public class Apple : Item, IFruit 
{ 
    public MethodExample(){} 
} 

С другой стороны, если вы хотите придерживаться явной реализации, то вы должны изменить свой код в этом:

IFruit example_item; 
example_item = new Apple(); 
+0

Просто обновил ваш код, чтобы он соответствовал обновленному вопросу, который я только что редактировал. – Jamiec

+0

Это, кажется, имеет смысл. Но им не дали возможность сделать это неявно. – Mdsm

+0

@Jamiec спасибо! –