Интерфейс по умолчанию не найден в классе c# - PullRequest
2 голосов
/ 26 марта 2020

У меня есть этот код в консольном приложении. net core 3.1 на VS 16.5.1:

namespace DefaultInterfaceTest
{
    class Program
    {
        static void Main(string[] args)
        {   
            var person = new Person();
            person.GetName();//error here
        }
    }

    public interface IPerson
    {
        string GetName()
        {
            return "Jonny";
        }
    }

    public class Person: IPerson
    {

    }
}

Я прыгал, я мог получить доступ к реализации по умолчанию для GetName от самого человека, так как это метод publi c, но он выдает эту ошибку:

'Person' does not contain a definition for 'GetName' and no accessible extension method 'GetName' accepting a first argument of type 'Person' could be found (are you missing a using directive or an assembly reference?)

Как я могу получить доступ к реализации интерфейса по умолчанию из внешнего кода или из самого класса Person? Спасибо!

Ответы [ 2 ]

4 голосов
/ 26 марта 2020

Вы можете получить доступ к методам реализации по умолчанию, только вызвав ссылку на интерфейс (представьте их как явно реализованные методы).

Например:

// This works
IPerson person = new Person();
person.GetName();

Но:

// Doesn't works
Person person = new Person();
person.GetName();

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

private string SomeMethod()
{
  IPerson self = this;
  return self.GetName();
}

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

abstract class PersonBase
{
  public virtual string GetName()
  {
    return "Jonny";
  }
}
1 голос
/ 26 марта 2020

использует что-то, что вы можете использовать в вашей ситуации?

using System;

namespace DefaultInterfaceTest
{
    class Program
    {
        static void Main(string[] args)
        {   
            IPerson person = new Person();

            Person fooPerson = (Person) person;
            Console.WriteLine(person.GetName());
            Console.WriteLine(fooPerson.Foo());
        }
    }

    public interface IPerson
    {
        public string GetName()
        {
            return "Jonny";
        }
    }

    public class Person: IPerson
    {
      public string Foo()
      {
           return "Hello";
      }
    }
}
...