C#の基礎知識編:C#のクラスと構造体 (4)

黄舟
リリース: 2017-02-10 15:25:57
オリジナル
1219 人が閲覧しました

1. インターフェースとは何ですか? 特徴? コードを実装しますか?
インターフェイスは、interface キーワードを使用して定義され、クラス メンバーの組み合わせと、いくつかの関数を説明する一連の仕様で構成されます。 C# でわかるように、システムの一部のインターフェイスには、IComparable (型比較方法)、ICloneable (クローン作成のサポート)、IDisposable (リソースの解放) などの名前が付けられています。I はインターフェイスを表し、able はインターフェイスの特性を反映します。インターフェイス: 「Can...」は、この仕様セットで何ができるかを示します。
(1)、インターフェイス実装

   public interface IPrintAble
    {
        void PrintString();

        void PrintInt();

        void PrintBool();
    }

    public interface IComputeAble
    {
        void HandlerString();

        void HandlerInt();

        void HandlerBool();
    }

    public class MyInplementInterface : IPrintAble, IComputeAble
    {
        //隐式实现
        public void PrintString()
        {
            Console.WriteLine(@"1");
        }

        public void PrintInt()
        {
            Console.WriteLine(1);
        }

        public void PrintBool()
        {
            Console.WriteLine(true);
        }

        public void HandlerString()
        {
            Console.WriteLine(@"1" + "1");
        }

        public void HandlerInt()
        {
            Console.WriteLine(1 + 1);
        }

        public void HandlerBool()
        {
            Console.WriteLine(true || false);
        }

        //显示实现
        //void IComputeAble.HandlerString()
        //{
        //    throw new NotImplementedException();
        //}

        //void IComputeAble.HandlerInt()
        //{
        //    throw new NotImplementedException();
        //}

        //void IComputeAble.HandlerBool()
        //{
        //    throw new NotImplementedException();
        //}
    }
      class Program
    {
        static void Main(string[] args)
        {
            MyInplementInterface imple = new MyInplementInterface();

            imple.PrintString();

            imple.PrintInt();

            imple.PrintBool();

            imple.HandlerString();

            imple.HandlerInt();

            imple.HandlerBool();

            Console.ReadLine();
        }
    }
ログイン後にコピー

結果:

(2) 専用インターフェイス、つまり C# で定義されたインターフェイスを実装します
例:

    public class ImplementSysInterface : IComparable
    {
        public int CompareTo(object obj)
        {
            //可以根据需要实现自己的比较方法
            return 0;
        }

        private void UsingMenthod()
        {
            //报错,因为NoIDisposeableClass没有实现IDisposable接口,所以不支持using
            //using (NoIDisposeableClass my = new NoIDisposeableClass())
            //{

            //}
            //实现IDisposable接口后,可以使用using
            using (IDisposeableClass my = new IDisposeableClass())
            {

            }
        }
    }

    public class NoIDisposeableClass
    {

    }

    public class IDisposeableClass : IDisposable
    {
        #region IDisposable 成员

        public void Dispose()
        {
            
        }

        #endregion
    }
ログイン後にコピー

インターフェイスには次の特性があります:
a。インターフェイスは抽象基本クラスに似ており、インターフェイスは直接インスタンス化できません。インターフェイス内のメソッドはすべて抽象メソッドであり、インターフェイスを実装する非抽象型はインターフェイスのすべてのメンバーを実装する必要があります。インターフェイスの一部が明示的に実装されている場合、実装されたメンバーはクラス インスタンスを介して渡すことはできません。アクセスにはインターフェイス インスタンスを介してのみアクセスできます。
例:

   public class MyInplementInterface2 : IComputeAble
    {
        void IComputeAble.HandlerString()
        {
            Console.WriteLine(@"1" + "1");
        }

        void IComputeAble.HandlerInt()
        {
            Console.WriteLine(true || false);
        }

        void IComputeAble.HandlerBool()
        {
            Console.WriteLine(true || false);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            IComputeAble imple2 = new MyInplementInterface2();

            imple2.HandlerString();

            Console.ReadLine();
        }
    }
ログイン後にコピー

c. インターフェイスのメンバーが暗黙的に実装されている場合、実装されたメンバーにはクラス インスタンスまたはインターフェイス インスタンスを通じてアクセスできますが、実装されたメンバーはパブリックである必要があります。

d. インターフェイスには、定数、フィールド、演算子、インスタンス コンストラクター、デストラクター、または型を含めることはできず、静的メンバーを含めることもできません。
e. インターフェイスのメンバーは自動的にパブリックになり、アクセス修飾子を含めることはできません。
f. インターフェイス自体は複数のインターフェイスから継承でき、クラスと構造体は複数のインターフェイスから継承できますが、インターフェイスはクラスから継承できません。

2. ジェネリックとは何ですか? ジェネリック医薬品のメリットは何ですか?
いわゆるジェネリックは、型パラメーターの概念を .NET に導入し、パラメーター化された型を通じて同じコード上で複数のデータ型の操作を実現します。これは参照型であり、ヒープ オブジェクトです。
実際、私は Java を勉強していたときに初めてジェネリックについて学びました。当時はジェネリックは不要で、オブジェクトで実行できるといつも思っていました。たとえば、次のように、型の値を出力したいと考えた場合、オブジェクトが実装されます:

    public class Test
    {
        private object model;

        public object Model
        {
            get
            {
                return model;
            }

            set
            {
                model = value;
            }
        }

        public Test(object model)
        {
            this.Model = model;
        }

        public void ShowRecord()
        {
            Console.WriteLine(model);
        }
    }
   class Program
    {
        static void Main(string[] args)
        {
            int recordI = 2;

            bool recordB = true;

            Test testI = new Test(recordI);

            testI.ShowRecord();

            Test testB = new Test(recordB);

            testB.ShowRecord();

            Console.ReadLine();
        }
    }
ログイン後にコピー

しかし、さらに詳しく学ぶと、まだ特定の問題があることがわかります。まず、ボックス化の問題があります。Int は値型です。オブジェクト型に値を割り当てる場合、ボックス化操作を完了する必要があります。クレートとは何ですか?これは、recordI 値を新しいオブジェクトによって割り当てられたスペースにコピーすることです。時間とパフォーマンスの無駄。したがって、ジェネリックにはまだ役割があるため、ジェネリックを使用して実装します:

  public class TestGeneric<T>
    {
        private T model;

        public T Model
        {
            get
            {
                return model;
            }

            set
            {
                model = value;
            }
        }

        public TestGeneric(T model)
        {
            this.Model = model;
        }

        public void ShowRecord()
        {
            Console.WriteLine(model);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            int recordI = 2;

            bool recordB = true;

            TestGeneric<int> testGI = new TestGeneric<int>(recordI);

            testGI.ShowRecord();

            TestGeneric<bool> testGB = new TestGeneric<bool>(recordB);

            testGB.ShowRecord();

            Console.ReadLine();
        }
    }
ログイン後にコピー
このように、TestGeneric testGI = new TestGeneric(recordI) の場合、T は int なので、ボックス化する必要はありません。

もちろん、ジェネリックはボックス化の問題を解決するだけではなく、次のような機能的特徴があります: a. ボックス化とボックス化解除を回避し、パフォーマンスを向上させます
b. コンパイルされるため、型の安全性が向上します。
d. 独自の汎用インターフェイス、汎用クラス、汎用メソッド、汎用イベント、および汎用デリゲートを作成できます。
上記は C# の基礎知識をまとめたものです: C# のクラスと構造体 (4) さらに関連するコンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!