Как я могу вызвать метод из класса, но этот метод реализован из любого интерфейса? - PullRequest
0 голосов
/ 30 мая 2010

я пытаюсь вызвать base.Alan (); в HacimBul. Но база. не давать IntelliSense метод Алана

   public double HacimBul()
        {
            throw new Exception();
            //return base..... --> how can i see base.Alan();
        }

namespace interfaceClass
{
    class Program
    {
        static void Main(string[] args)
        {

        }
    }

    interface Ikenar
    {
       double kenar { get; set; }
    }

    interface Iyukseklik
    {
        double yuksekli {get; set;}
    }
    interface IAlan
    {
        double Alan();
    }
    interface IHacim
    {
        double Hacim();
    }

    class Alan : Ikenar, IAlan
    {
        public double kenar
        {
            get;
            set;
        }

        double IAlan.Alan()
        {
            return kenar * kenar;
        }
    }

    class Hacim : Alan, Iyukseklik
    {

        public double kenar
        {
            get;
            set;
        }

        public double yuksekli
        {
            get;
            set;
        }

        public double HacimBul()
        {
            throw new Exception();
            //return base..... --> how can i see base.Alan();
        }
   }
}

Ответы [ 4 ]

1 голос
/ 30 мая 2010

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

Это означает, что для вызова метода вам необходимо:

  • Измените явную реализацию вашего метода Алана на неявную (сделав метод общедоступным) в Alan:

    public void Alan()
    {
    }
    
  • или вам придется разыграть экземпляр во время вызова:

    ((IAlan)this).Alan();
    

К сожалению, с этим последним синтаксисом вы на самом деле не будете вызывать «base.Alan», а просто «this.Alan», что может иметь значение, если вы также переопределите этот метод в классе-потомке.

Вот пример:

using System;

namespace interfaceClass
{
    public interface ITest
    {
        void Execute();
    }

    public class Base : ITest
    {
        void ITest.Execute()
        {
            Console.Out.WriteLine("Base.ITest.Execute");
        }
    }

    public class Descendant : Base, ITest
    {
        void ITest.Execute()
        {
            Console.Out.WriteLine("Descendant.ITest.Execute");
        }

        public void Test()
        {
            // There's no way to call "base.Execute()" here
            ((ITest)this).Execute();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Descendant d = new Descendant();
            d.Test();
        }
    }
}
1 голос
/ 30 мая 2010

Нет, в данный момент это не сработает. Базовая реализация только доступна для выражения типа IAlan из-за явной реализации интерфейса.

Вы можете использовать это:

return ((IAlan)this).Alan();

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

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

public interface IFoo
{
    void Bar();
}

public class BaseFoo : IFoo
{
    void IFoo.Bar()
    {
        // Do something
    }
}

public class DerivedFoo : BaseFoo
{
    void OtherMethod()
    {
        // Doesn't compile due to explicit interface implementation
        base.Bar();

        // Will work
        ((IFoo)this).Bar();
    }
}
0 голосов
/ 30 мая 2010

Вы сделали явную реализацию Alan, поэтому у вас есть опции

либо измените имя метода или класса с именем Alan, чтобы у вас не было конфликта имен, и реализуйте метод как обычный метод E.g

public double Alan() //name of class can't be Alan in this case
{
   return kenar * kenar;
}

или

public double HacimBul()
 {
    return ((IAlan)this).Alan();
 }

Причина, по которой вы не получаете intellisense, заключается в том, что метод доступен, только если объект типа Alan объявлен как IAlan, в противном случае метод Alan будет скрыт

0 голосов
/ 30 мая 2010
double IAlan.Alan() // this is explicit interface implementation
{
   return kenar * kenar;
}

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

Измените вышеприведенное на

double Alan()
{
   return kenar * kenar;
}

внутри Alan класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...