继承类中的c#接口

时间:2013-11-27 10:29:33

标签: c# interface

    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。有人可以解释我们的错误吗?非常感谢!

6 个答案:

答案 0 :(得分:2)

在您的情况下,Eleve[]中的对象必须是Tricheur类型,而不是您需要的实现或所有其他类(FaineantFourbe ,. ..)还要实现像Tricheur这样的相同实现(但最后是个坏主意)。

答案 1 :(得分:1)

如果FourbeEleve的直接孩子

您创建的数组的类型为Eleve

tatic Eleve[] eleves = new Eleve[6];

Eleve扩展PersonnePersonne包含方法triche。这就是调用Personne.triche的原因。

班级class Tricheur : Eleve, ITricheur实际上并不是Eleve之后。因此,triche被调用是没有意义的。

如果FourbeTricheur的直接孩子

您需要以这种方式覆盖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 
        }
    }