我如何从类调用方法,但这个方法从任何接口实现?

时间:2010-05-30 18:32:10

标签: c# .net visual-studio oop

我尝试调用base.Alan();在HacimBul。但基地。不要给出智能感知方法

   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 个答案:

答案 0 :(得分:1)

不,它暂时不起作用。由于显式接口实现,基本实现仅 在类型为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();
    }
}

答案 1 :(得分:1)

该方法不是公共的或受保护的,它是您定义它的私有方式,甚至比private更私密,它只有在您通过界面时才可用。

这意味着为了调用该方法,您必须:

  • 在Alan中将Alan方法的显式实现更改为隐式方法(使方法公开):

    public void Alan()
    {
    }
    
  • 或者,您必须在通话过程中强制转换实例:

    ((IAlan)this).Alan();
    

不幸的是,在那里的最后一个语法中,你实际上不会调用“base.Alan”,而只是“this.Alan”,如果你也在后代类中重写那个方法,这可能会有所不同。 / p>

以下是一个例子:

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();
        }
    }
}

答案 2 :(得分:0)

double IAlan.Alan() // this is explicit interface implementation
{
   return kenar * kenar;
}

通过在方法名称前加上接口,您可以告诉用户方法Alan只能通过接口和参数的引用来使用。不属于班级。

将上述内容更改为

double Alan()
{
   return kenar * kenar;
}

Alan课程内。

答案 3 :(得分:0)

您已明确实施了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类型的obejct 声明为IAlan时才可用,否则Alan方法将被隐藏