我是一个完整的编程新手(特别是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等东西,但是一旦我理解了上面的例子就会很容易。
我试着查看其他讨论和问题,以及其他网站,但实际上找不到任何解决方案。提前谢谢大家。
答案 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);