インタフェースユニットテスト

インターフェースの性質は、契約(契約)、両方見えます。

そして配列の平均数を合計します

配列の異なる種類の、異なる方法

using System;
using System.Collections;

namespace March9
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            int[] nums1 = new int[] {1, 2, 3, 4, 5};
            ArrayList nums2 = new ArrayList {1, 2, 3, 4, 5};
            Console.WriteLine(Sum(nums1));
            Console.WriteLine(Avg(nums1));
        }

        static int Sum(int [] nums)
        {
            int sum = 0;
            foreach (var n in nums)
            {
                sum += n;
            }
            return sum;
        }

        static double Avg(int[] nums)
        {
            int sum = 0;
            double count = 0;
            foreach (var n in nums)
            {
                sum += n;
                count++;
            }
            return sum / count;
        }
        
    }
}

使用できるインターフェイス

using System;
using System.Collections;

namespace March9
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            int[] nums1 = new int[] {1, 2, 3, 4, 5};
            ArrayList nums2 = new ArrayList {1, 2, 3, 4, 5,6};//ArrayList,array继承自IEnumerable接口
            Console.WriteLine(Sum(nums2));
            Console.WriteLine(Avg(nums2));
        }

        static int Sum(IEnumerable nums)
        {
            int sum = 0;
            foreach (var n in nums)
            {
                sum +=(int) n;
            }
            return sum;
        }

        static double Avg(IEnumerable nums)
        {
            int sum = 0;
            double count = 0;
            foreach (var n in nums)
            {
                sum += (int) n;
                count++;
            }
            return sum / count;
        }
        
    }
}

インタフェースは、疎結合、代替の機能を促進するために、生まれて

using System;
using System.Collections;

namespace March9
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            var user=new User(new VIVO());//实现用户使用不同的手机打电话,发信息
            user.Userphone();
        }

    }

    class User
    {
        private IPhone _phone;
        public User(IPhone phone)//接收接口类型的变量
        {
            _phone = phone;
        }
        public void Userphone()
        {
            _phone.Dial();
            _phone.Pickup();
            _phone.Send();
            _phone.Receive();
        }
        
    }


    interface IPhone
    {
        void Dial();//拨号
        void Pickup();//接听
        void Send();//发送
        void Receive();//接收
    }

    class NokiaPhone:IPhone
    {
        public void Dial()
        {
            Console.WriteLine("Nokia is calling");
        }
        public void Pickup()
        {
            Console.WriteLine("hello,tim");
        }
        public void Send()
        {
            Console.WriteLine("Nokia is ring");
        }
        public void Receive()
        {
            Console.WriteLine("hello,maray");
        }
    }
    
    class VIVO:IPhone
    {
        public void Dial()
        {
            Console.WriteLine("VIVO is calling");
        }
        public void Pickup()
        {
            Console.WriteLine("hello");
        }
        public void Send()
        {
            Console.WriteLine("Vivo is send");
        }
        public void Receive()
        {
            Console.WriteLine("Vivo is receiving");
        }
    }
    
    
}

オブジェクト指向設計のための言語は、ビルトインサポート:依存反転、インターフェース分離、開口部と原則を閉じる......

依存関係反転

ここで再び、それは車追従しているドライバ上で、依存しています。車の運転手のタイプはフィールドがあり、彼らは緊密に結合されています。各個人が、この場合にのみ対応車を開くことができ、他の車を開くことができない

分野でのドライバは、もはや車や他の車両の種類が、ベースのインタフェースである、車を呼び出すための様々な方法を実行していない、がありました依存性逆転。

ユーザーや複数のサービスのサービスプロバイダがインターフェイスを踏襲しているとき、それはより一致することができます。メソッド呼び出しの異なるインスタンスを達成するためのブリッジとしてインターフェイスを介して。

インターフェイスの棲み分け

契約:パーティー(派生クラス)これ以上であると、B(インタフェース)劣らずに。何の呼び出しがなかった場合、それは彼が不必要であることを示し、脂肪のインタフェースです。
シングル責任原則、一つだけのクラスです。
例:男性が車のさまざまなを開いてみましょう

using System;

namespace March10
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            var a=new Driver(new Car());//此时car类和Truck都能开汽车,因为他继承自IVhicle接口,如果我想开坦克呢?那么就要改变Driver引用实例的变量的类型。
            a.Drive();
        }
    }


    class Driver
    {
        private IVehicle _vehicle;//此时,IVehicle类型的变量能引用继承自IVhicle接口实例的方法;ITank类型的变量能引用继承自ITank接口的实例的方法

        public Driver(IVehicle vehicle)
        {
            _vehicle = vehicle;
        }

        public void Drive()
        {
            _vehicle.Run();
        }


    }

    interface IVehicle
    { 
        void Run();
    }

    class Car:IVehicle
    {
        public void Run()
        {
            Console.WriteLine("car is runnning!");
        }
    }

    class Truck:IVehicle
    {
        public void Run()
        {
            Console.WriteLine("truck is running!");
        }
    }

    interface ITank
    {
        void Fire();
        void Run();
    }

    class LightTank:ITank
    {
        public void Fire()
        {
            Console.WriteLine("开炮");
        }

        public void Run()
        {
            Console.WriteLine("ka……ka……ka");
        }
    }
}

このトラブルの多くのために上記の交換のための交流の方法、問題は、異なる機能を、より少ないと脂肪、火災()メソッドでは、インタフェースパスですが、私はちょうど火が他のことを行うのではなく、ドライブしたいです。
火災()メソッドは、単一のインターフェースを行い、その後ITankインタフェース継承を2つのベースインタフェースをできるようにします。インターフェイスは多重継承であり、クラスはできません。

using System;

namespace March10
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            var a=new Driver(new Car());
            a.Drive();
        }
    }


    class Driver
    {
        private IVehicle _vehicle;

        public Driver(IVehicle vehicle)
        {
            _vehicle = vehicle;
        }

        public void Drive()
        {
            _vehicle.Run();
        }


    }

    interface IVehicle
    { 
        void Run();
    }
    interface Single
    { 
        void Fire();
    }

    class Car:IVehicle
    {
        public void Run()
        {
            Console.WriteLine("car is runnning!");
        }
    }

    class Truck:IVehicle
    {
        public void Run()
        {
            Console.WriteLine("truck is running!");
        }
    }

    interface ITank:IVehicle,Single
    {
    }

    class LightTank:ITank
    {
        public void Fire()
        {
            Console.WriteLine("开炮");
        }

        public void Run()
        {
            Console.WriteLine("ka……ka……ka");
        }
    }
}

この時点で、我々はITankインタフェースを呼び出し、あなただけの内部から継承された実行IVhicle方法に焦点を当てることができ、ドライバーのみ実行メソッドの呼び出しは、呼び出し側がより多くなるのに役立つことはありません。
我々はドライバーのクラスプライベートITankの_vehicleを変更した場合の質問は再び、;変数の型コンストラクタが変化し、そうでしょう、runメソッドの車やトラックのクラスはインターフェースの使いすぎているため、呼び出すことはできません、と渡す必要があります小さなインターフェース。

おすすめ

転載: www.cnblogs.com/lpxspring/p/12448049.html