iT邦幫忙

0

C# 委派問題 (以解決)

c#
    public delegate void Call();
    class Program
    {
        static void Main(string[] args)
        {
            ClassA classa = new ClassA();
            ClassB classb = new ClassB();
            classb.MethodB();
        }
    }
    public class ClassA
    {
        ClassB classb = new ClassB();
        public ClassA()
        {
            classb.call = MethodA;
        }
        public void MethodA()
        {
            Console.WriteLine("Call Class A Function");
        }
    }
    public class ClassB
    {
        public Call call;

        public void MethodB()
        {
            Console.WriteLine("Call Class B Function");
            call();
        }

    }

問題1,如圖1
請問我要如何在不宣告ClassA的情況下讓ClassB裡面的函數可以引用ClassA裡面的函數,我這樣執行會錯誤我不太知道問題在哪裡,麻煩指點一下.

public delegate void Call();
class Program
{
    static void Main(string[] args)
    {
        ClassB classb = new ClassB();
        classb.MethodB();

       
    }
}
public class ClassA
{ 
    public void MethodA()
    {
        Console.WriteLine("Call Class A Function");
    }
    public void MethodA2()
    {
        Console.WriteLine("wwwwwwwwwwwwwwwwwwwwww");
    }
}
public class ClassB
{
    ClassA classA = new ClassA();
    Call call;
    public ClassB()
    {
        call = classA.MethodA;
    }
    public void ChangeDel()
    {
        call = classA.MethodA2;
    }
    public void MethodB()
    {
        Console.WriteLine("Call Class B Function");
        call();
    }
}

問題2,如圖2
我這樣雖然ClassB可以呼叫ClassA的函數,可是我都宣告了那委派不是多此一舉,還是有其他觀念呢

問題3,如圖2
那假設我有另外一個ClassC,我想要呼叫call這個委派的時候,一樣可以呼叫ClassA裡面的函數嗎.

第一次發文問問題,表達不清楚的地方請見諒

2 個回答

2
sion
iT邦新手 4 級 ‧ 2019-07-31 13:28:11
最佳解答

我之前的文章
你可以參考
依賴注入

舉個委派例子
getprice傳進一個price後給haldor處理再傳回處理後的price
而haldor內的邏輯是之後再給的 Convert.ToInt32(Math.Pow(20d,2d))

delegate int PriceHaldor(int price);
    
class creditcard
{
    public int getprice(int price, PriceHaldor haldor)
    {
        return haldor(price);
    }
}
static void Main()
{
    PriceHaldor price = new PriceHaldor(r => Convert.ToInt32(Math.Pow(20d,2d)) );
    creditcard card = new creditcard();
    int q = card.getprice(money, price);
}
看更多先前的回應...收起先前的回應...
a22927106 iT邦新手 5 級 ‧ 2019-07-31 13:36:14 檢舉

這個對我來說太高深了....

sion iT邦新手 4 級 ‧ 2019-07-31 13:41:39 檢舉

你這不是委派阿

a22927106 iT邦新手 5 級 ‧ 2019-07-31 13:44:55 檢舉

所以我打得跟委派沒有關係嗎... 原來都打錯了
您的那篇文我現在卡在怎麼在外部實例B

a22927106 iT邦新手 5 級 ‧ 2019-07-31 13:47:46 檢舉
using System;
namespace ConsoleApp2
{
    public delegate void Call();
    class Program
    {
        static void Main(string[] args)
        {
            ClassB classb = new ClassB();
            classb.ChangeDel();
            ClassC classc = new ClassC(classb);

        }

        public class ClassA
        {
            public void MethodA()
            {
                Console.WriteLine("Call Class A Function");
            }
            public void MethodA2()
            {
                Console.WriteLine("wwwwwwwwwwwwwwwwwwwwww");
            }
        }
        public class ClassB
        {
            ClassA classA = new ClassA();
            Call call;
            public ClassB()
            {
                call = classA.MethodA;
            }
            public void ChangeDel()
            {
                call += classA.MethodA2;
            }
            public void MethodB()
            {
                Console.WriteLine("Call Class B Function");
                call();
            }
        }
        public class ClassC
        {
            ClassB _classb;
            public ClassC(ClassB classb)
            {
                this._classb = classb; 
                _classb.MethodB();
            }
        }
    }
}

這樣嘛!!!

sion iT邦新手 4 級 ‧ 2019-07-31 13:52:12 檢舉

我更新了一個委派的方法給你看

sion iT邦新手 4 級 ‧ 2019-07-31 13:56:47 檢舉

a22927106 iT邦新手 5 級 ‧ 2019-07-31 14:04:35 檢舉
PriceHaldor price = new PriceHaldor(r =>   Convert.ToInt32(Math.Pow(20d,2d)) 

不好意思 目前這段看不懂 那個r是lambda的表示法,代表r帶入後面的函式 可是為什麼=>後面沒有出現r,那個20d,2d請問是什麼

sion iT邦新手 4 級 ‧ 2019-07-31 15:47:51 檢舉

我宣告了一個這個

delegate int PriceHaldor(int price);

r就是指向裡面int的變數,然後這個數字是後面算出來的
Math.Pow(20d,2d))你用VS看就知道了

a22927106 iT邦新手 5 級 ‧ 2019-07-31 16:30:27 檢舉

了解了 謝謝~~
那請問第一個問題有辦法嗎

a22927106 iT邦新手 5 級 ‧ 2019-07-31 16:38:21 檢舉

阿 我第一個問題用你那篇文的方法成功了 非常感謝/images/emoticon/emoticon02.gif

2
小魚
iT邦大師 1 級 ‧ 2019-07-31 13:07:35

請不要貼圖直接貼文字.
可以用兩個```前後包起來

a22927106 iT邦新手 5 級 ‧ 2019-07-31 13:36:03 檢舉

謝謝提醒 已更改

我要發表回答

立即登入回答