如何实现从子类到父类的返回方法?

时间:2019-04-14 18:35:46

标签: c#

我有一个父类Zival,我从中创建子类odraslaZival,该子类返回用户定义的一些数字,并在Mladic中我想返回枚举。父类已经具有返回类型,如何将子类的返回类型添加到父类中?

class Zival
{

    public Zival(string p, int s, double t, Dnevnik d, Kartoteka k)
    {
        poreklo = p;
        starost = s;
        teza = t;
        Dnevnik = d;
        Kartoteka = k;
        this.spol = spol;
    }

    public string Izpis()
    {
        return "Ime:"+this.poreklo+" Starost:"+ this.starost + " Teža:" + this.teza+"\n" + this.Dnevnik.Izpis() + this.Kartoteka.Izpis();
    }
}

class OdraslaZival : Zival
{
    int NumberOfChild;

    public OdraslaZival(string p, int s, double t, Dnevnik d, Kartoteka k, Spol spol, int NumberOfChild) : base(p, s, t, d, k)
    {
        this.NumberOfChild = NumberOfChild;
    }
}

class Mladic : Zival
{
    enum prehranjevanje { mesojedec, rastlinojedec, vsejedec}

    public Mladic(string p, int s, double t, Dnevnik d, Kartoteka k, Spol spol, int prehranjevanje) : base(p, s, t, d, k)
    {

    }
} 

我希望程序返回:“ this.poreklo + this.starost + this.teza + this.Dnevnik.Izpis()+ this.Kartoteka.Izpis()+'sublcas枚举'+'NumberOfChild'”

2 个答案:

答案 0 :(得分:0)

将您的打印方法设为虚拟

public virtual string Izpis()
{
    return "Ime:"+this.poreklo+" Starost:"+ this.starost + " Teža:" + this.teza+"\n" +
        this.Dnevnik.Izpis() + this.Kartoteka.Izpis();
}

这允许您在子孙类中覆盖它。

class OdraslaZival : Zival
{
    int NumberOfChild;

    ...

    public override string Izpis()
    {
        return  base.Izpis() + " Number of children: " + NumberOfChild;
    }
}

Mladic类中,您可以写作

public override string Izpis()
{
    return  base.Izpis() + " My enum: " + prehranjevanje;
}

但是您当然不能在类Mladic中打印类OdraslaZival的枚举,因为后者只能访问父类及其本身的成员,而不能访问同级类。

答案 1 :(得分:0)

如果我对您的理解正确,那么您正在询问对象继承。子类可以调用base.Method()并将其数据附加到从父类返回的内容上。在C#中,继承是从父级流到子级,而不是子级流向父级。因此,孩子可以访问父母的方法和属性,但是父母不了解他们的孩子。

class Program
{
    static void Main(string[] args)
    {
        var bar = new Bar("Jane Doe", 25);
        Console.WriteLine(bar.Speak());
        Console.Read();
    }

}

public class Foo
{
    public string Name { get; set; }

    public Foo(string name)
    {
        Name = name;
    }

    public virtual string Speak() => $"My Name is {Name}";
}

public class Bar: Foo
{
    public int Age { get; set; }

    public Bar(string name, int age) : base(name)
    {
        Age = age;
    }

    public override string Speak()
    {
        return $"{base.Speak()} and my age is {Age}";
    }
}

返回“我叫Jane Doe,我25岁。”