C#使用不同方法创建包含可访问变量的列表

时间:2016-12-22 21:03:47

标签: c# syntax interface abstract-class

我是一个完整的编程新手(特别是C#),这是我的问题。 我需要创建一个包含可以在不同类中访问/引用/使用的变量的类,我尝试过我认为所有内容(接口,抽象类,列表)仍然无法使其工作。

以下是最新的代码片段,其中包含最新的概念:

abstract class FuelsList
{
    string sFuelName;
    float fFuelPrice;

    void LPG()
    {
        sFuelName = "LPG";
        fFuelPrice = 0.65f;
    }

    void Diesel()
    {
        sFuelName = "Diesel";
        fFuelPrice = 0.95f;
    }

    void Petrol()
    {
        sFuelName = "Petrol";
        fFuelPrice = 1.15f;
    }
}

然后使用这些列表我想在其他类中引用它(如果我记得很清楚),就像这样:

Console.WriteLine("This pump dispenses {0} and the price is {1} per litre.",
FuelsList.Petrol.sFuelName, FuelsList.Petrol.sFuelPrice);

不确定我是否正在尝试重新发明一个轮子,或者在那里工作时更容易做600%的工作。问题是我需要通过访问器访问许多类,接口,继承和私有字段,因为它是多态和字段访问练习。此外,我需要创建类似的东西,但CarTypes会有像FuelUsed,TankCapacity等东西,但是一旦我理解了上面的例子就会很容易。

我试着查看其他讨论和问题,以及其他网站,但实际上找不到任何解决方案。提前谢谢大家。

4 个答案:

答案 0 :(得分:2)

这是我想象的一种方式:

由于LPG,Petrol和Diesel具有相同的属性但没有默认值,我将为它们定义一个基本的规则(接口)。如果我对每个人都有一些默认行为,我会使用抽象类。

 public interface IFuel
 {
     string Name { get; }
     float Price { get; }
 }

为家庭

实施规则
 public class LPG : IFuel
 {
     public string Name => "LPG";
     public float Price => 0.65f;
 }

 public class Diesel : IFuel
 {
     public string Name => "Diesel";
     public float Price => 0.95f;
 }

 public class Petrol : IFuel
 {
     public string Name => "Petrol";
     public float Price => 1.15f;
 }

定义消费者。在这里,我可以选择使用接口以更简单的方式注入依赖对象。 使用者对象处理如何使用依赖于燃料对象

 public class FuelConsumer
 {
     private readonly IFuel fuel;

     public FuelConsumer(IFuel fuelData)
     {
         fuel = fuelData;
     }

     public string GetFuelDetails()
     {
         return $"This pump dispenses {fuel.Name} and the price is {fuel.Price} per litre.";
     }
 }

用法:我可以将任何类型的燃料传递给消费者,我们让每个对象只负责处理它的工作,没有紧密耦合,更易读和可维护。

下一个检查点将是我的设计是否真的SOLID

 FuelConsumer consumer = null;
 IFuel fuel = null;

 // Let's use LPG
 fuel = new LPG();
 consumer = new FuelConsumer(fuel);
 Console.WriteLine(consumer.GetFuelDetails());

 // Let's use diesel
 fuel = new Diesel();
 consumer = new FuelConsumer(fuel);
 Console.WriteLine(consumer.GetFuelDetails());

 // Let's use petrol
 fuel = new Petrol();
 consumer = new FuelConsumer(fuel);
 Console.WriteLine(consumer.GetFuelDetails());

答案 1 :(得分:0)

这可能就是你要找的东西。这是基类Fuel

public abstract class Fuel
{
    public string Name { get; private set; }
    public decimal Price { get; private set; }

    public override string ToString()
    {
        return string.Format(@"Name: {0} Price: {1}", Name, Price.ToString("C"));
    }

    protected Fuel(string name, decimal price)
    {
        this.Name = name;
        this.Price = price;
    }
}

每种燃料类型都是源于它的类别:

public class Petrol : Fuel
{
    public Petrol(decimal price) : base("Petrol", price) { }
}

public class Diesel : Fuel
{
    public Diesel(decimal price) : base("Diesel", price) { }
}

public class Lpg : Fuel
{
    public Lpg(decimal price) : base("LPG", price) { }
}

然后您可以使用它们,例如:

var petrol = new Petrol(1.15M);
var diesel = new Diesel(0.95M);
var lpg = new Lpg(0.65M);

System.Diagnostics.Debug.Print(@"My fuels: " + 
    Environment.NewLine + string.Join(
    Environment.NewLine, new[] { petrol.ToString(), diesel.ToString(), lpg.ToString() }));

答案 2 :(得分:0)

创建两个类 - 一个用于存储Fuel对象,另一个用于存放不同类型的对象。然后,只使用属性而不是方法(这就是你想要的,你的语法有误)。

public static class FuelList
{
    static FuelList()
    {
        LPG = new Fuel{ Name = "LPG", Price = .65F };
        //...
    }
    public static Fuel LPG {get;} 
    public static Fuel Diesel {get;}
    public static Fuel Petrol {get;}
}

public sealed class Fuel
{
    public string Name {get;set;}
    public float Price {get;set;}
}

然后你可以按照你的意图使用它:

Console.WriteLine("This pump dispenses {0} and the price is {1} per litre.",
                   FuelsList.Petrol.Name, FuelsList.Petrol.Price);

答案 3 :(得分:0)

请不要只是复制/粘贴,你不会从中学到任何东西。理解这段代码,就像你说的那样,其余的练习都很容易愚蠢。

public class Fuel
{
    private string sFuelname = default(string);
    private float Price = default(float);

    public string FuelName
    {
        get { return sFuelName; } set { sFuelName = value; }
    }

    public float FuelPrice
    {
        get { return fFuelPrice; } set { fFuelPrice= value; }
    }

public static class FuelsList
{
    public Fuel LPG
    {
        get
        {
            var temp = new Fuel
            {
                FuelName = "LPG",
                FuelPrice = 0.65f
            }

            return temp;
        }
    }

    public Fuel Diesel
    {
        get
        {
            var temp = new Fuel
            {
                FuelName = "Diesel",
                FuelPrice = 0.95f
            }

            return temp;
        }
    }

    public Fuel Petrol
    {
        get
        {
            var temp = new Fuel
            {
                FuelName = "Petrol",
                FuelPrice = 1.15f
            }

            return temp;
        }
    }
}

用法:

Console.WriteLine("This pump dispenses {0} and the price is {1} per litre.", FuelsList.Petrol.FuelName, FuelsList.Petrol.FuelPrice);