C \ # 에서 추상 류 와 인터페이스의 차이 점

9507 단어
최근 에 디자인 모델 을 배우 고 있 습 니 다. 모든 모델 은 선인 들 의 경험의 전승 이 고 정 리 를 통 해 형 성 된 특정한 문제 의 일반적인 해결 방안 입 니 다. 이런 것들 은 목적 이 있 는 것 이 라 고 말 합 니 다. 하하 여러분 과 관 계 를 맺 지 않 겠 습 니 다. 본론 으로 돌아 가 겠 습 니 다. 저 는 인터페이스의 중요 성 을 말 하기 위해 디자인 모델 이 매우 중요 하 다 고 생각 합 니 다. 그래서 자주 사용 하 는 것 이 더욱 중요 합 니 다.최근 에 디자인 모델 을 공부 할 때 항상 인터페이스, 추상 류 를 만 났 습 니 다. 이 모델 은 추상 류 이 고 그 모델 은 인터페이스 입 니 다. 저 는 어리둥절 해서 진지 하 게 연구 하기 로 결 정 했 습 니 다. 다음은 제 연구 결 과 를 여러분 과 공유 하 겠 습 니 다. 의견 을 많이 내주 시기 바 랍 니 다.
무엇이 인터페이스 입 니까?
프로그램 을 정의 하 는 협정인터페이스의 클래스 나 구 조 를 실현 하려 면 인터페이스의 정의 와 엄격하게 일치 해 야 한다.이 협정 이 있 으 면 프로 그래 밍 언어의 제한 을 버 릴 수 있다.C \ # 인 터 페 이 스 는 여러 개의 기본 인터페이스 에서 계승 할 수 있 고 클래스 나 구 조 는 여러 개의 인 터 페 이 스 를 실현 할 수 있다.C \ # 인 터 페 이 스 는 방법, 속성, 이벤트, 색인 기 를 포함 할 수 있 습 니 다.인터페이스 자체 가 정 의 된 구성원 의 실현 을 제공 하지 않 습 니 다.인 터 페 이 스 는 이 인 터 페 이 스 를 실현 하 는 클래스 나 인터페이스 가 제공 해 야 할 구성원 만 지정 합 니 다.
어떻게 인 터 페 이 스 를 사용 합 니까?
예 를 들 면:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace              
{
    class Program
    {
        static void Main(string[] args)
        {
            User user = new User();
            Department dept = new Department();

            //Ifactory factory =new SqlserverFactory();
            IFactory factory = new AccessFactory();
            
            //                  
            IUser iu = factory.CreateUser();

            iu.Insert(user);
            iu.GetUser(1);

            IDepartment id = factory.CreateDepartment();

            id.Insert(dept);
            id.GetDepartment(1);

            Console.Read();

        }
    }


    class User
    {
        private int id;
        public int ID
        {
            get { return id; }
            set { id = value; }
        }

    }

    class Department
    {
        private int id;
        public int ID
        {
            get { return id; }
            set { id = value; }
        }

        
    }
    //IDepartment  ,       ,             。
    interface IDepartment
    {
        void Insert(Department department);

        Department GetDepartment(int id);
    }

    //SqlserverDepartment ,    SQL Server Department
    class SqlserverDepartment : IDepartment
    {
        public void Insert(Department department)
        {
            Console.WriteLine(" SQL Server   Department       ");
        }

        public Department GetDepartment(int id)
        {
            Console.WriteLine(" SQL Server    ID  Department     ");
            return null;
        }
    
    }

    //Access ,    Access Department
    class AccessDepartment : IDepartment
    {
        public void Insert(Department department)
        {
            Console.WriteLine(" Access   Department       ");
        }

        public Department GetDepartment(int id)
        {
            Console.WriteLine(" Access   ID  Department     ");
            return null;
        }

    }

    //IUser  ,       ,             
    interface IUser
    {
        void Insert(User user);
        User GetUser(int id);
    }

    //SqlserverUser ,    SQL Server User
    class SqlserverUser : IUser
   {
        public void Insert(User user)
        {
            Console.WriteLine(" SQL Server   User       ");
        }

        public User GetUser(int id)
        {
            Console.WriteLine(" SQL Server   ID  User     ");
            return null;
        }

    }

    //Access ,    Access User
    class AccessUser : IUser
    {
        public void Insert(User user)
        {
            Console.WriteLine(" Access  User       ");

        }
        public User GetUser(int id)
        {
            Console.WriteLine(" Access     User     ");
            return null;
        }
    }

    //IFactory   ,        Department           

    interface IFactory
    {
        IUser CreateUser();

        //       
        IDepartment CreateDepartment();
    }

    //SqlServerFactory ,  IFactory  ,   SqlserverUser SqlserverDepartment

    class SqlserverFactory : IFactory
    {
        public IUser CreateUser()
        {
            return new SqlserverUser();

        }

        public IDepartment CreateDepartment()
        {
            return new SqlserverDepartment();
        }
    }

    //AccessFactory ,  IFactory  ,   AccessUser AccessDepartment

    class AccessFactory : IFactory
    {
        public IUser CreateUser()
        {
            return new AccessUser();

        }

        public IDepartment CreateDepartment()
        {
            return new AccessDepartment();
        }
    }
}

무엇이 추상 류 입 니까?
추상 류 는 추상 적 인 방법 을 포함 하 는 류 이다.그렇다면 무엇이 또 추상 적 인 방법 일 까?추상 적 인 방법 은 방법 내용 이 없고 방법 이름과 매개 변수 목록 만 있 는 방법 이다.아울러결말그의 남 다른 점 을 표시 하기 위해, 그의 복귀 유형 에 abstract 를 추가 합 니 다.클 라 스 앞 에 abstract 를 추가 합 니 다.
쉽게 말 하면 abstract 로 수식 하 는 방법 과 유형 은 추상 적 인 방법 과 유형 이다.
어떻게 추상 류, 추상 적 인 방법 을 사용 하고 추상 적 인 방법 을 어떻게 실현 합 니까?
예 를 들 면:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace        
{
    class Program
    {
        static void Main(string[] args)
        {
            //  Context      ConcreteStateA
            Context c = new Context(new ConcreteStateA());

            //     ,      
            c.Request();
            c.Request();
            c.Request();
            c.Request();

            Console.Read();
        }
    }

    //Context ,    COncreteState     ,           
    class Context
    {
        private State state;
        
        //  Context     
        public Context(State state)
        {
            this.state = state;

        }

        //        ,              
        public State State
        {
            get { return state; }
            set
            {
                state = value;
                Console.WriteLine("    :" + state.GetType().Name);
            }
        }

        //      ,       
        public void Request()
        {
            state.Handle(this);
        }

    }
    //     State,          Context            
    abstract class State
    {
        public abstract void Handle(Context context);
    }

    //ConcreteState ,    ,          Context          
    class ConcreteStateA : State
    {
        public override void Handle(Context context)
        {
            //  ConcreteStateA       ConcreteStateB
            context.State = new ConcreteStateB();
        }
    }

    class ConcreteStateB : State
    {
        public override void Handle(Context context)
        {
            //  ConcreteStateB       ConcreteStateA
            context.State = new ConcreteStateA();
        }
        
    }

}

인터페이스 와 추상 류 를 혼동 해도 사실은 모두 나 를 탓 할 수 없다. 왜냐하면 그들 은 확실히 비슷 한 점 이 있 기 때문이다.
인터페이스 와 추상 류 의 공통점:
1. 실례 화 할 수 없다.
2. 실현 되 지 않 은 방법 성명 포함;
3. 파생 류 는 반드시 실현 되 지 않 은 방법 을 실현 해 야 한다. 추상 류 는 추상 적 인 방법 이 고 인 터 페 이 스 는 모든 구성원 (방법 뿐만 아니 라 다른 구성원 도 포함한다) 이다.
그래도 큰 차이 가 있어 요.
인터페이스 와 추상 류 의 차이:
1. 유형 은 대상 에 대한 추상 적 인 것 으로 추상 류 를 대상 으로 하고 추상 적 인 유형 을 추상 류 라 고 할 수 있다. 인 터 페 이 스 는 행위 의 규범 이나 규정 일 뿐이다.
2. 인 터 페 이 스 는 대체적으로 계승 하 는 구체 적 인 특징 을 가지 지 않 고 호출 할 수 있 는 방법 만 약속 했다.
3. 하나의 클래스 는 한 번 에 여러 개의 인 터 페 이 스 를 실현 할 수 있 지만 하나의 부모 클래스 만 확장 할 수 있 습 니 다.
4. 인 터 페 이 스 는 리 셋 을 지원 할 수 있 지만 계승 은 이런 특징 을 가지 지 않 는 다.
5. 추상 류 는 밀봉 되 어 서 는 안 된다.
6. 추상 류 가 실현 하 는 구체 적 인 방법 은 기본적으로 허 이지 만 인 터 페 이 스 를 실현 하 는 클래스 의 인터페이스 방법 은 기본적으로 비 허 적 입 니 다. 물론 허 적 이 라 고 설명 할 수 있 습 니 다.
7. (인터페이스) 비 추상 류 와 유사 하고 추상 류 도 이러한 기본 목록 에 표 시 된 인터페이스의 모든 구성원 에 게 자신의 실현 을 제공 해 야 한다.그러나 추상 류 가 인터페이스 방법 을 추상 적 인 방법 에 반영 하도록 허용 한다.
8. 추상 류 는 oop 중의 한 원칙 을 실현 하고 가 변 적 인 것 과 가 변 적 인 것 을 분리 한다.추상 류 와 인 터 페 이 스 는 가 변 적 이지 않 은 것 으로 정의 하고 가 변 적 인 좌석 자 류 를 실현 하 는 것 이다.
9. 좋 은 인터페이스 정 의 는 다기 능 이 아니 라 특정한 기능 성 을 가 져 야 한다. 그렇지 않 으 면 인터페이스 오염 을 초래 해 야 한다.만약 에 하나의 유형 이 이 인터페이스의 한 기능 만 실현 하고 인터페이스 중의 다른 방법 을 실현 해 야 한다 면 인터페이스 오염 이 라 고 한다.
10. 계승 을 통 해 구성 기능 을 실현 하 는 것 을 피하 고 블랙박스 재 활용, 즉 대상 조합 을 사용한다.상속 의 차원 이 증가 하기 때문에 가장 직접적인 결 과 는 바로 당신 이 이 부류 의 어떤 종 류 를 호출 할 때 반드시 그들 을 모두 창고 에 불 러 와 야 한 다 는 것 입 니 다!결 과 는 가히 짐작 할 수 있다.또한, 세심 한 친 구 는 마이크로소프트 가 하나의 유형 을 구축 할 때 대상 조합 방법 을 사용 하 는 경우 가 많다 는 것 을 알 수 있다.예 를 들 어 asp. net 에서 Page 류 는 ServerRequest 등 속성 이 있 지만 사실은 그들 은 모두 특정한 유형의 대상 이다.페이지 류 의 이 대상 을 사용 하여 다른 종류의 방법 과 속성 을 호출 하 는 것 은 매우 기본 적 인 디자인 원칙 입 니 다.
11. 추상 류 가 인 터 페 이 스 를 실현 하면 인터페이스 에서 방법 을 추상 류 에 투사 하여 추상 적 인 방법 으로 실현 하지 않 고 추상 류 의 하위 류 에서 인터페이스 에서 방법 을 실현 할 수 있다.
추상 류 와 인 터 페 이 스 를 언제 사용 합 니까?
1. 구성 요소 의 여러 버 전 을 만 들 예정 이 라면 추상 류 를 만 듭 니 다.추상 류 는 구성 요소 버 전 을 제어 하 는 간단 한 방법 을 제공한다.
2. 만 든 기능 이 넓 은 범위 의 모든 대상 에서 사용 된다 면 인 터 페 이 스 를 사용 합 니 다.작고 세련 된 기능 블록 을 설계 하려 면 인 터 페 이 스 를 사용한다.
3. 큰 기능 단원 을 설계 하려 면 추상 류 를 사용 합 니 다. 구성 요소 의 모든 실현 간 에 통용 되 는 실현 기능 을 제공 하려 면 추상 류 를 사용 합 니 다.
4. 추상 류 는 주로 밀접 한 관 계 를 가 진 대상 에 사용 된다.인 터 페 이 스 는 관련 이 없 는 클래스 에 유 니 버 설 기능 을 제공 하기에 적합 하 다.
아래 에 몇 가지 비유 가 매우 적절 하 게 말 되 어 있 는데, 여러분 도 그 중에서 많은 것 을 깨 달 을 수 있 을 것 입 니 다.
1. 비행 기 는 날 수 있 고 새 는 날 수 있 으 며 그들 은 모두 같은 인터페이스 인 '날 기' 를 계승 했다.그러나 F22 는 비행기 추상 류 에 속 하고 비 둘 기 는 새 추상 류 에 속한다.
2. 철문 나무 문 이 모두 문 (추상 류) 인 것 처럼 문 을 원 하면 내 가 줄 수 없 지만 구체 적 인 철문 이나 나무 문 (다 형) 을 줄 수 있다.그리고 문 만 있 을 수 있 습 니 다. 창문 이 라 고 할 수 없습니다.하나의 문 은 자물쇠 (인터페이스) 도 있 고 초인종 (다 중 실현) 도 있다.문 (추상 류) 은 당신 이 무엇 인지 정의 합 니 다. 인터페이스 (자물쇠) 는 당신 이 무엇 을 할 수 있 는 지 규정 합 니 다.

좋은 웹페이지 즐겨찾기