static Eleve[] eleves = new Eleve[6];
static void Main(string[] args)
{
int[] notes;
eleves[0] = new Faineant("Schtroumpf", "Faineant");
eleves[1] = new Fourbe("Schtroumpf", "Fourbe");
eleves[2] = new Bon("Schtroumpf", "Bon");
eleves[3] = new Fayot("Schtroumpf", "Fayot");
eleves[4] = new PasTresBon("Schtroumpf", "PasTrèsBon");
eleves[5] = new PasTresBon("Schtroumpf", "PasTrèsBon 2");
eleves[1].triche(); //Here is the problem ! not swag.
}
*
class Personne
{ public virtual void triche() {}
public virtual void prepareLeCafe() { }
}
*
abstract class Eleve : Personne ;
*
class Tricheur : Eleve, ITricheur
{ void ITricheur.triche()
{
min = 15;
max = 15;
}
}
*
public interface ITricheur
{
void triche();
}
运行“eleves [1] .triche();”时调用的方法是Personne中的那个,而不是Tricheur中的那个:Eleve,ITricheur。有人可以解释我们的错误吗?非常感谢!
答案 0 :(得分:2)
在您的情况下,Eleve[]
中的对象必须是Tricheur
类型,而不是您需要的实现或所有其他类(Faineant
,Fourbe
,. ..)还要实现像Tricheur
这样的相同实现(但最后是个坏主意)。
答案 1 :(得分:1)
如果Fourbe
是Eleve
的直接孩子
您创建的数组的类型为Eleve
。
tatic Eleve[] eleves = new Eleve[6];
Eleve
扩展Personne
,Personne
包含方法triche
。这就是调用Personne.triche
的原因。
班级class Tricheur : Eleve, ITricheur
实际上并不是Eleve
之后。因此,triche
被调用是没有意义的。
如果Fourbe
是Tricheur
的直接孩子
您需要以这种方式覆盖triche
,
class Tricheur : Eleve, ITricheur
{
public void override ITricheur.triche()
{
min = 15;
max = 15;
}
}
答案 2 :(得分:0)
似乎你错过了代码示例中的某些内容。我刚从编译器添加了缺少的部分,它可以工作。
现在的问题是:您想进入Personne.triche()
还是进入Tricheur.triche()
?
internal class Program
{
private static Eleve[] eleves = new Eleve[6];
private static void Main(string[] args)
{
eleves[0] = new Tricheur("Schtroumpf", "Faineant");
eleves[1] = new Tricheur("Schtroumpf", "Fourbe");
eleves[2] = new Tricheur("Schtroumpf", "Bon");
eleves[3] = new Tricheur("Schtroumpf", "Fayot");
eleves[4] = new Tricheur("Schtroumpf", "PasTrèsBon");
eleves[5] = new Tricheur("Schtroumpf", "PasTrèsBon 2");
var eleve = eleves[1];
var tricheur = eleve as ITricheur;
if (tricheur != null)
tricheur.triche();
eleve.triche();
}
}
public interface ITricheur
{
void triche();
}
internal abstract class Eleve : Personne
{ }
internal class Personne
{
public virtual void prepareLeCafe()
{ }
public virtual void triche()
{ }
}
internal class Tricheur : Eleve, ITricheur
{
private int max;
private int min;
public Tricheur(string a, string b)
{
}
void ITricheur.triche()
{
min = 15;
max = 15;
}
}
所以要进入Tricheur.triche()
,你应该改变你的实现方式:
internal class Tricheur : Eleve, ITricheur
{
public Tricheur(string a, string b)
{
}
void ITricheur.triche()
{
// If you remove this method, you'll get
// always into the overriden method below.
}
public override void triche()
{
}
}
答案 3 :(得分:0)
这两种方法:
public virtual void triche() {}
和
void ITricheur.triche()
是两个不同的方法。第一个字母是ITricheur.triche
的{{3}}。
如果您真的想在最终祖先中创建虚拟triche
方法,则必须在后代覆盖它(无论它是否也在界面中声明 - 两者将实际匹配),像这样:
public override void triche() { … }
答案 4 :(得分:0)
在类和接口上有相同名称的方法,默认情况下,您从Personne
(父)类调用方法。如果您需要ITrecheur
的来电方式,则必须致电
(eleves[1] as ITricheur).triche();
答案 5 :(得分:0)
你发出的是以下Tricheur从Eleve继承,所以你的调试器看到triche()是正确的,但在运行时不会做任何事情,因为虚拟没有实现,什么都不会被执行 所以你应该做这样的事情
public class Personne {
public virtual void triche() { }
public virtual void prepareLeCafe() { }
}
public abstract class Eleve : Personne
{
public override void triche()
{
// here your code
}
}