我尝试调用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();
}
}
}
答案 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方法将被隐藏