2016-12-22 7 views
2

私はプログラミング(特にC#)の完全なルーキーです。ここに私の問題があります。 私は、異なるクラス間でアクセス/参照/使用できる変数を持つクラスを作成する必要があります。私はすべて(インターフェイス、抽象クラス、リスト)を考えてみましたが、まだ動作させることはできません。そして、これらのようなリストを使用して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%好きなのかわからない場合は、はるかに簡単です。問題は、多形性やフィールドへのアクセスにアクセスするため、多くのクラス、インターフェイス、継承、およびアクセサリを介してアクセス可能なプライベートフィールドが必要なことです。また、同様のものを作成する必要がありますが、FuelUsed、TankCapacityなどのようなものを持つCarTypesを使用しますが、上記の例を理解すると簡単になります。

私は他の議論や質問や他のサイトを見てみましたが、実際にはこれを解決できませんでした。あらかじめありがとうございます。

答えて

2

これは私がそれを思い描くでしょう一つの方法である:LPG、ガソリン、及びディーゼル以来

が同じ属性何もデフォルトを持っている、私は基本的に定義しますルール(インタフェース)に従ってください。私はそれぞれのデフォルトの動作を持っていた場合、私は抽象クラスを使用していたでしょう。

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()); 
であるかどうかだろう
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() })); 
0

作成します2つのクラス - 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); 
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); 
関連する問題