繁体   English   中英

C#中的多态和接口

[英]Polymorphism and Interfaces in C#

创建三个与继承无关的小类-建筑,汽车和自行车类。 使用GetCarbonFootprint方法编写接口ICarbonFootprint。 让您的每个类都实现该接口,以便其GetCarbonFootprint方法为该类计算适当的碳足迹(请查看一些网站来解释如何计算碳足迹)。 编写一个应用程序,该应用程序创建三个类的每个对象,将对这些对象的引用放置在List中,然后遍历List,以多态方式调用每个对象的GetCarbonFootprint方法。 Car的构造函数初始化“加仑汽油”,而Building的构造函数将初始化buiding-square-footage。

如何计算碳足迹

一加仑汽油产生的汽车二氧化碳排放量为20磅

将建筑物的平方英尺数乘以50

没有一个自行车

我的老师的代码:

public static void Main(string[] args)
        {
            ICarbonFootprint[] list = new ICarbonFootprint[3];

            // add elements to list
            list[0] = new Bicycle();
            list[1] = new Building(2500);
            list[2] = new Car(10);

            // display carbon footprint of each object
            for (int i = 0; i < list.Length; i++)
                list[i].GetCarbonFootprint();
        } // end Main
    }

我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Miller
{
    class Program
    {
        static void Main(string[] args)
        {
            Bicycle bike = new Bicycle();
            Building b = new Building();
            Car car = new Car();

            List<ICarbonFootprint> list = new List<ICarbonFootprint>();


            list.Add(bike);
            list.Add(b);
            list.Add(car);

            int totalCarbon = 0;

            foreach (var item in list)
            {
                totalCarbon += item.GetCarbonFootprint();
                Console.WriteLine("{0} has a footprint of: {1}", item,      item.GetCarbonFootprint());
            }

            Console.WriteLine("Total footprint is: {0}", totalCarbon);

            Console.ReadKey();
        }


    }


    public class Bicycle : ICarbonFootprint
    {
        private string _make;
        private string _model;

        public string Make
        {
            get { return _make; }
            set { _make = value; }
        }

        public string Model
        {
            get { return _model; }
            set { _model = value; }
        }

        public int GetCarbonFootprint()
        {
            return 10;
        }

        public override string ToString()
        {
            return string.Format("Bike");
        }
    }

    public class Building : ICarbonFootprint
    {
        private string _address;

        public string Address
        {
            get { return _address; }
            set { _address = value; }
        }

        public int GetCarbonFootprint()
        {
            return 2000;
        }

        public override string ToString()
        {
            return string.Format("Building");
        }
    }

    public class Car : ICarbonFootprint
    {
        private string _make;
        private string _model;


        public string Make
        {
            get { return _make; }
            set { _make = value; }
        }
        public string Model
        {
            get { return _model; }
            set { _model = value; }
        }

        public int GetCarbonFootprint()
        {
            return 1500;
        }

        public override string ToString()
        {
            return string.Format("Car");
        }
    }

    public interface ICarbonFootprint
    {
        int GetCarbonFootprint();



    }


}

我整合了我的讲师的代码(第12-23行更改为AKA类,仅更改了Program):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Miller
{
    class Program
    {
        public static void Main(string[] args)
        {
            ICarbonFootprint[] list = new ICarbonFootprint[3];

            // add elements to list
            list[0] = new Bicycle();
            list[1] = new Building(2500);
            list[2] = new Car(10);

            // display carbon footprint of each object
            for (int i = 0; i < list.Length; i++)
                list[i].GetCarbonFootprint();
        } // end Main
    }

    public class Bicycle : ICarbonFootprint
    {
        private string _make;
        private string _model;

        public string Make
        {
            get { return _make; }
            set { _make = value; }
        }

        public string Model
        {
            get { return _model; }
            set { _model = value; }
        }

        public int GetCarbonFootprint()
        {
            return 10;
        }

        public override string ToString()
        {
            return string.Format("Bike");
        }
    }

    public class Building : ICarbonFootprint
    {
        private string _address;

        public string Address
        {
            get { return _address; }
            set { _address = value; }
        }

        public int GetCarbonFootprint()
        {
            return 2000;
        }

        public override string ToString()
        {
            return string.Format("Building");
        }
    }

    public class Car : ICarbonFootprint
    {
        private string _make;
        private string _model;


        public string Make
        {
            get { return _make; }
            set { _make = value; }
        }
        public string Model
        {
            get { return _model; }
            set { _model = value; }
        }

        public int GetCarbonFootprint()
        {
            return 1500;
        }

        public override string ToString()
        {
            return string.Format("Car");
        }
    }

    public interface ICarbonFootprint
    {
        int GetCarbonFootprint();



    }


}

因此,将我的Program类的代码替换为教师的代码,我收到以下错误:

Program.cs(51,23,51,41): error CS1729: 'Miller.Building' does not contain a         constructor that takes 1 arguments
Program.cs(52,23,52,34): error CS1729: 'Miller.Car' does not contain a   constructor that takes 1 arguments

现在,由于天气(雪)取消了春假前的最后两天,因此我们无法进行讨论。 我的代码似乎可以按照指令的要求进行操作,但是我想让Class Program的教师代码可以与我的代码一起使用。 有人可以帮助我解决这些错误吗?

您的代码存在一些问题。

首先,您需要包括构造函数以使代码编译。

对于Building它看起来像:

    private int squareFootage;
    public Building(int squareFootage)
    {
        this.squareFootage = squareFootage;
    }

对于Car它看起来像:

    private int gasGallons;
    public Car(int gasGallons)
    {
        this.gasGallons = gasGallons;
    }

接下来,您无需遵循计算碳足迹的规则。

他们应该是:

    //Bicycle
    public int GetCarbonFootprint()
    {
        return 0;
    }

    //Building
    public int GetCarbonFootprint()
    {
        return 50 * squareFootage;
    }

    //Car
    public int GetCarbonFootprint()
    {
        return 20 * gasGallons;
    }

最后,您的讲师的代码实际上不会显示任何结果。 for循环中的代码应更改为Console.WriteLine(list[i].GetCarbonFootprint()); 如果这是一个控制台应用程序。

因此,所有代码应如下所示:

public static void Main(string[] args)
{
    ICarbonFootprint[] list = new ICarbonFootprint[3];

    // add elements to list
    list[0] = new Bicycle();
    list[1] = new Building(2500);
    list[2] = new Car(10);

    // display carbon footprint of each object
    for (int i = 0; i < list.Length; i++)
        Console.WriteLine(list[i].GetCarbonFootprint());
}

    public class Bicycle : ICarbonFootprint
    {
        public string Make { get; set; }
        public string Model { get; set; }

        public int GetCarbonFootprint()
        {
            return 0;
        }
    }

    public class Building : ICarbonFootprint
    {
        private int squareFootage;
        public Building(int squareFootage)
        {
            this.squareFootage = squareFootage;
        }

        public string Address { get; set; }

        public int GetCarbonFootprint()
        {
            return 50 * squareFootage;
        }
    }

    public class Car : ICarbonFootprint
    {
        private int gasGallons;
        public Car(int gasGallons)
        {
            this.gasGallons = gasGallons;
        }

        public string Make { get; set; }
        public string Model { get; set; }

        public int GetCarbonFootprint()
        {
            return 20 * gasGallons;
        }
    }

    public interface ICarbonFootprint
    {
        int GetCarbonFootprint();
    }

我选择简化属性定义,而不是使用字段来实现它们。

输出为:

0
125000
200

您应该像下面这样编写Building和Car的构造函数:

public Building(int MyValue)
{
...
}

并且您的代码可以正常工作。

建议:Car和Bicycle共享属性和ICarbonFootprint实现,因此您可以使用抽象方法创建基类。 同样,来自ICarbonFootprint接口的GetCarbonFootprint必须是System.Double类型。

public interface ICarbonFootprint
{
    int GetCarbonFootprint();
}

public class Building : ICarbonFootprint
{
    public int BuildingSquareFootage { get; set; }
    public string Address { get; set; }

    public Building(int buildingSquareFootage, string address)
    {
        BuildingSquareFootage = buildingSquareFootage;
        Address = address;
    }

    public int GetCarbonFootprint()
    {
        return BuildingSquareFootage * 50;
    }

    public override string ToString()
    {
        return string.Format("Building");
    }
}

public abstract class CarBicycleBase : ICarbonFootprint
{
    public string Make { get; set; }
    public string Model { get; set; }
    protected CarBicycleBase(string make, string model)
    {
        Make = make;
        Model = model;
    }
    public abstract int GetCarbonFootprint();
}

public class Bicycle : CarBicycleBase
{
    public Bicycle(string make, string model)
        : base(make, model) { }

    public override int GetCarbonFootprint()
    {
        return 0;
    }

    public override string ToString()
    {
        return string.Format("Bike");
    }
}

public class Car : CarBicycleBase
{
    public int GallonOfGas { get; set; }

    public Car(int gallonOfGas, string make, string model)
        : base(make, model)
    {
        GallonOfGas = gallonOfGas;
    }

    public override int GetCarbonFootprint()
    {
        return GallonOfGas * 20;
    }

    public override string ToString()
    {
        return string.Format("Car");
    }
}

例:

...
var list = new List<ICarbonFootprint>(3)
{
    new Car(10, "...", "..."),
    new Bicycle("...", "..."),
    new Building(20, "...")
};

foreach (ICarbonFootprint item in list)
    item.GetCarbonFootprint();
...

希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM