2016-10-31 15 views
2

私は与えられた課題を実行しようとしていますが、失敗しています。私は製品クラスを書いてそれから花を作りました。花量が20を下回ったときにイベントを起こしたいと思っています。私はイベントを起こすのが難しいと思う。私はデリゲートとイベントの正式な決定を下したと確信していますが、何かが欠けています。前もって感謝します。イベントを呼び出せません

flower.StockDecreased(); 

この行は、私は、このエラーを与える:

Error 3 The event 'StokTakip.Product.StockDecreased' can only appear on the left hand side of += or -= (except when used from within the type 'StokTakip.Product') 


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

namespace StokTakip 
{ 
class Program 
{ 
    static void FlowerStockDecreased() 
    { 
     Console.WriteLine("Flower stock decreased"); 
    } 

    static void Main(string[] args) 
    { 
     Product flower = new Product("Flower", 50); 
     Console.WriteLine(flower); 

     flower.StockDecreased += new Product.FlowerEventHandler(FlowerStockDecreased); 

     while (true) 
     { 
      Console.WriteLine("What is your choice"); 
      Console.WriteLine("[1] Stock entry quantity "); 
      Console.WriteLine("[2] Stock exit quantity: ");     

      int choice = Convert.ToInt32(Console.ReadLine()); 

      if (choice == 1) 
      { 
       Console.Write("Enter stock entry quantity: "); 
       flower.quantity += Convert.ToInt32(Console.ReadLine()); 

      } 

      else if (choice == 2) 
      { 
       Console.Write("Enter stock exit quantity: "); 
       flower.quantity -= Convert.ToInt32(Console.ReadLine()); 
      }    

      Console.WriteLine(flower); 

      if (flower.quantity<20) 
      { 
       flower.StockDecreased(); //???? 

      }    
     } 
    }  
} 

}

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

namespace StokTakip 
{ 
public class Product 
{ 
    public string name; 
    public int quantity; 

    public Product(string a, int m) 
    { 
     name = a; 
     quantity = m; 
    }  

    public override string ToString() 
    { 
     return "Name: "+ this.name + " Stock Quantity: " + this.quantity; 
    } 

    public delegate void FlowerEventHandler(); 
    public event FlowerEventHandler StockDecreased; 
} 

}

+0

これはエラーメッセージです。 publicメンバー 'StockDecreased'は、追加と削除という2つのメソッドしか提供しません。イベントを所有しているクラス以外の場所からイベントを呼び出すことはできません。 – Luaan

答えて

3

エラーメッセージがかなり明確です。あなたはそのようなイベントを起こすことはできません。宣言クラスのみがこのようなイベントを呼び出すことができ、イベントを発生させることができます。他のすべてのクラスは、イベントからイベントハンドラを追加する(+=)か、イベントハンドラを削除する(-=)ことができます。このようなイベントを発生させるProductクラスにパブリックメソッドを入れて何ができる

public void RaiseStockDecreased() 
{ 
    if (StockDecreased != null) 
     StockDecreased(); 
} 

あなたは外部からそれを呼び出すことができます。

Productクラス自体が、在庫が増減して適切な出来事を起こすかどうかを判断すると予想されるので、これもまた適切な設計と矛盾します。それ以外の場合は、在庫の変更について通知を受けたいすべての場所にそのロジックを実装する必要があります。より良いパターンがちょうど変更が正または負であるかどうかを確認し、適切なイベントを発生させることができStockChange方法を持っているかもしれないけど

public class Product 
{ 
    public event FlowerEventHandler StockDecreased; 

    private int _quantity; 
    public int Quantity 
    { 
     get { return _quantity; } 
     set 
     { 
      int newQuantity = value; 
      if (newQuantity < _quantity) 
      { 
       if (StockDecreased != null) StockDecreased(); 
      } 
      _quantity = newQuantity; 
     } 
    } 

    // Other stuff 
} 

+0

ご説明いただきありがとうございます。 – Lyrk

0

あなたの製品クラスは、次のようになります。

+0

これは本当に賢いです。設定時に数量を確認する。あなたの時間をありがとう。私は他のクラスではなく、プロダクトクラスでこれを行うべきだと思います。 Thorstenが言ったように、私がこれを実装しないと、これを使うすべてのクラスでメソッドを作るべきです。 – Lyrk

関連する問題