문제

유형이 클래스와 다르고 그 반대의 이유는 무엇입니까?

(일반적인 언어 공유의 의미에서)

도움이 되었습니까?

해결책

다음 답변은 GOF Book에서 나온 것입니다.디자인 패턴)

대상 수업 객체가 구현되는 방식을 정의합니다. 클래스는 객체의 내부 상태와 해당 작업의 구현을 정의합니다.

대조적으로, 대상 유형 응답 할 수있는 일련의 요청 세트 인 인터페이스 만 나타냅니다.

객체는 많은 유형을 가질 수 있으며 다른 클래스의 객체는 동일한 유형을 가질 수 있습니다.

//example in c++
template<typename T> 
const T & max(T const & a,T const &b)
{
return a>b?a:b;  //> operator of the type is used for comparison
}

최대 기능에는 유형이 필요합니다 작동> 자체 유형의 IT 인터페이스로서 위의 요구 사항을 충족하는 클래스를 사용하여 해당 클래스의 특정 최대 기능을 생성하는 데 사용될 수 있습니다.

다른 팁

나는 항상 'type'을 '클래스'및 '프리미티브'의 우산 용어로 생각합니다.

int foo; // Type is int, class is nonexistent.

MyClass foo; // Type is MyClass, class is MyClass

에서 영감을 받다 위키 백과...

~ 안에 유형 이론 자귀;

  • 유형 추상 인터페이스입니다.
    유형은 일반적으로 사람, 장소 또는 사물 또는 명목화 된 것과 같은 명사를 나타냅니다.

  • 수업 유형의 구현을 나타냅니다.
    구체적인 데이터 구조 및 서브 루틴 수집입니다.

    다른 콘크리트 클래스는 동일한 추상 유형의 객체를 생성 할 수 있습니다 (유형 시스템에 따라 다름).

    *예를 들어, 하나를 구현할 수 있습니다 유형 Stack 두 개와 함께 클래스: SmallStack (작은 스택에는 빠르지 만 비늘이 나쁘다). ScalableStack (작은 스택의 경우 잘 비늘지만 오버 헤드가 높습니다).*

    마찬가지로, 주어진 클래스는 여러 가지 다른 것을 가질 수 있습니다 생성자.

enter image description here

바나나 예.

  • Banana 유형 일반적으로 바나나의 특성과 기능을 나타냅니다.

  • 그만큼 ABCBanana 그리고 XYZBanana 클래스 바나나를 생산하는 방법을 나타냅니다.
    (비디오 게임에서 바나나를 대표하고 끌어내는 다른 데이터 구조 및 기능의 다른 바나나 공급 업체).

    그만큼 ABCBanana 그런 다음 수업은 특정 바나나를 생산할 수 있습니다 인스턴스ABCBanana 수업, 그들은 될 것입니다 사물유형 바나나.

프로그래머가 유형에 대한 단일 및 유일한 구현을 제공하는 것은 드문 일이 아닙니다. 이 경우 수업 이름은 종종 동일합니다 유형 이름. 그러나 여전히 유형 (필요한 경우 인터페이스에서 추출 할 수 있음)과 클래스의 인스턴스 (객체)를 빌드하는 구현 (별도의 인터페이스를 구현)이 있습니다.

유형은 사용 가능한 모든 객체 템플릿 또는 개념에 대한 우산 용어입니다. 클래스는 그러한 객체 템플릿 중 하나입니다. 구조 유형, 정수 유형, 인터페이스 유형 등입니다. 이들은 모든 유형입니다.

원한다면 이런 식으로 볼 수 있습니다. 유형은 부모 개념입니다. 다른 모든 개념 : 클래스, 인터페이스, 구조, 정수 등이 개념에서 상속됩니다.

유형에는 데이터에 대한 설명이 포함되어 있습니다 (즉, 속성, 작업 등)

클래스는 특정 유형입니다. 인스턴스를 생성하는 템플릿입니다. 사물.

엄격하게 말하면 클래스는 특별한 개념이며, 서브 세트를 포함하는 패키지로 볼 수 있습니다. 메타 데이터 물체의 일부 측면을 설명합니다.

예를 들어 C#에서 인터페이스와 클래스를 찾을 수 있습니다. 둘 다 유형이지만 인터페이스는 일부 계약 만 정의 할 수 있으며 클래스와 달리 인스턴스화 할 수 없습니다.

단순히 말하기 수업 a 특수 유형 물체의 속성과 동작을 캡슐화하는 데 사용됩니다.

Wikipedia는보다 완전한 답변을 제공 할 수 있습니다.

가장 빠른 방법을 설명하기 위해 :

구조물은 유형이지만 구조물은 클래스가 아닙니다.

보시다시피, 유형은 클래스의 정의뿐만 아니라 Float, Int, Bool과 같은 스트러크 및 기본 데이터 유형에 대한 "추상적"용어입니다.

유형은 개념적으로 클래스의 슈퍼 세트입니다. 더 넓은 의미에서, 클래스는 한 형태의 유형입니다.

클래스와 밀접한 관련이있는 인터페이스는 매우 특별한 종류의 클래스로 볼 수있는 인터페이스입니다. 이것들도 유형입니다.

따라서 "유형"은 클래스, 인터페이스 및 대부분의 언어 프리미티브를 포함합니다. 또한 Dot-Net CLR과 같은 플랫폼에는 구조 유형도 있습니다.

내 생각은 Aku의 대답과 거의 일치합니다.

클래스는 객체를 작성하기위한 템플릿으로 보는 반면 유형은 해당 객체를 분류하고 인터페이스를 제공하는 방법입니다.

Python은 또한 클래스를 구축하는 것과 같은 방식으로 클래스를 구축하는 메커니즘 인 중량체를 추가합니다 (그리고 클래스와 메타 클래스는 둘 다 객체입니다).

이 응답 람바에서 같은 질문에 궁극적 인 것은 나에게 완벽한 설명처럼 보인다.

아래에서 GOF 인용에서 가져온 것 :

물체 수업 객체가 구현되는 방식을 정의합니다. 클래스는 오브젝트의 내부 상태와 작업 구현을 정의합니다.

대조적으로, 물체는 유형 응답 할 수있는 요청 세트 인 인터페이스 만 나타냅니다.

Java를 사용하여 예제를 제공하고 싶습니다.

public interface IType {
}

public class A implements IType {
public A{};
}

public class B implements IType {
public B{};
}

두 수업 모두 A 그리고 B 인터페이스를 구현하므로 유형입니다 IType. 또한 Java에서는 두 클래스 모두 자체 유형 (각각 클래스 이름)을 생성합니다. 따라서 수업 A 유형입니다 A 그리고 IType 그리고 수업 B 유형입니다 B 그리고 IType 만족스러운:

객체는 많은 유형을 가질 수 있으며 다른 클래스의 객체는 동일한 유형을 가질 수 있습니다.

하위 유형과 서브 클래스의 차이는 아마도 그 문제를 이해하는 데 도움이 될 것입니다.

https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html

구별의 또 다른 예를 추가하려면 : C ++에는 클래스를 참조 할 수 있지만 클래스 자체가 아닌 포인터 및 참조 유형이 있습니다.

Bar b; // b is of type "class Bar"
Bar *b2 = &b; // b2 is of type "pointer to Class Bar"
Bar &b3 = b; // b3 is of type "reference to Class Bar"
Bar *b4[7]; // b4 is of type "7-element array of pointers to Class Bar"
Bar ***b5; //b5 is of type "pointer to a pointer to a pointer to Class Bar"

하나의 클래스 만 참여하지만 거의 무한한 수의 유형을 사용할 수 있습니다. 일부 언어에서는 함수가 "일류 객체"로 간주됩니다.이 경우 기능 유형은 클래스입니다. 다른 경우, 함수의 유형은 단지 포인터 일뿐입니다. 클래스는 일반적으로 데이터를 보유 할 수있는 개념과 해당 데이터에 대한 작업이 있습니다.

나는 유형이 특정 가치로 할 수있는 일의 세트라고 생각합니다. 예를 들어, 정수 값이있는 경우 다른 정수에 추가하거나 다른 산술 작업을 수행하거나 정수 인수를 수락하는 함수로 전달할 수 있습니다. 객체 값이있는 경우 클래스에 의해 정의 된 메소드를 호출 할 수 있습니다.

클래스는 해당 클래스의 객체로 할 수있는 일을 정의하기 때문에 클래스는 유형을 정의합니다. 클래스는 그 이상입니다. 왜냐하면 메소드가 구현되는 방법 (유형에 따라 암시되지 않은 것)과 객체의 필드가 어떻게 배치되는지에 대한 설명을 제공하기 때문입니다.

또한 객체 값은 하나의 클래스 만 가질 수 있지만 모든 슈퍼 클래스는 객체 클래스에서 사용 가능한 기능의 하위 집합을 제공하기 때문에 여러 유형을 가질 수 있습니다.

따라서 객체와 유형이 밀접하게 관련되어 있지만 실제로는 같은 것이 아닙니다.

유형 일반적으로 정수, 문자열, 어레이, 부울, 널 등의 원시 값의 분류를 나타냅니다. 일반적으로 새로운 유형을 만들 수 없습니다.

수업 객체가 생성 될 때 객체가 연관된 지명 된 속성 세트 및 메소드를 나타냅니다. 일부 언어는 새 객체를 만들고 메소드를 첨부해야하지만 일반적으로 원하는만큼의 새로운 클래스를 정의 할 수 있습니다.

이 정의는 대부분 사실이지만 일부 언어는 다양한 방식으로 유형과 클래스를 다양한 유익한 결과와 결합하려고 시도했습니다.

유형과 클래스는 관련이 있지만 동일하지는 않습니다. 나는 클래스가 구현 상속에 사용되는 반면, 유형은 런타임 대체에 사용된다는 것입니다.

여기 설명하는 링크입니다 대체 원리 그리고 왜 서브 클래스와 하위 유형이 항상 같은 것은 아닙니다 (예 : Java에서). 그만큼 위키 백과 공분산 및 비정규 적 페이지는이 차이점에 대한 자세한 정보가 있습니다.

흥미로운 질문. 아쿠의 대답이 자리 잡았다 고 생각합니다. 자바를 가져 가라 ArrayList 수업은 예입니다

public class ArrayList<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

인스턴스 ArrayList 클래스는 확장되는 모든 슈퍼 클래스의 유형이며 모든 인터페이스가 구현되는 것으로 알려져 있습니다. 따라서 인스턴스 ArrayList 클래스에는 유형이 있습니다 ArrayList, RandomAccess, Cloneable, 기타 등등. 다시 말해, 값 (또는 인스턴스)은 하나 이상의 유형에 속하며 클래스는 이러한 유형이 무엇인지 정의합니다.

다른 클래스는 동일한 유형을 설명 할 수 있습니다.

유형은 이러한 부분으로 구성됩니다.

  1. 작업 = 구문
  2. 운영에 대한 설명 = 의미론

수업은이 부분으로 구성됩니다.

  1. 작업 = 구문
  2. 구현 (= 다양한 구현은 동일한 의미를 설명합니다)

몇 가지 메모 :

  • 인터페이스 (Java에서와 같이)는 의미론을 설명하지 않기 때문에 유형이 아닙니다 (구문 만 설명)

  • 서브 클래스는 서브 클래스가 슈퍼 클래스로 정의 된 시맨틱을 변경할 수 있기 때문에 서브 타입이 아니기 때문에 서브 타입은 슈퍼 유형 시맨틱을 변경할 수 없다 (예 : Liskov 대체 원리 참조. 이 LSP 예).

유형 시스템이있는 언어가있는 언어가있는 언어가 있으므로 유형 보다 넓은 개념이어야합니다 수업

Java와 같은 언어에서도 int (원시) 유형이지만 클래스는 아닙니다.

따라서 : 모든 수업은 유형이지만 모든 유형이 클래스 인 것은 아닙니다.

C# 문맥 에서이 질문에 대해 생각한다면, 우리는 벨로그 답변에 도달합니다.

C# 유형 시스템은 다음 범주로 나뉩니다.

가치 유형 :

  • 간단한 유형 : int, long, float 등과 마찬가지로
  • 열거적인 유형
  • 구조물 유형
  • 무효 유형

참조 유형 :

  • 수업 유형
  • 인터페이스 유형
  • 배열 유형
  • 대표 유형

보시다시피 C#에는 클래스가 그중 하나 일뿐입니다. 중요한 참고 사항은 하나뿐입니다. C#의 유형 시스템은 모든 유형의 값이 객체로 취급 될 수 있도록 통합됩니다. C#의 모든 유형은 객체 클래스 유형에서 직접 또는 간접적으로 파생되며 객체는 모든 유형의 궁극적 인 기본 클래스입니다. 참조 유형의 값은 값을 유형 객체로 보면 객체로 취급됩니다. 값 유형의 값은 권투 및 Unboxing 작업을 수행하여 객체로 취급됩니다.

내가 알 수 있듯이, 유형은 클래스 중 하나 인 많은 항목에 대한 우산입니다.

추천 : CSAHRP 언어 사양 문서, 4 페이지

~ 안에 일반적인 언어 공유 감각 - 수업 이다 실현유형.

이것이 종종 해당 유형의 실현, 두 용어를 사용하여 일부 컨텍스트에서 참조 할 수 있습니다.

반대로, 예를 들어 C# context에서 - 수업 그냥이야 하나더 많은 구현 a 유형 프리미티브, 스트러크, 포인터 등과 같은 개념

이것은 나에게 좋은 질문이었다. 나는 클래스가 컴파일 타임이라고 말하고 유형은 런타임 일이라고 감히 말할 것입니다. 나는 당신이 유형이 아닌 클래스를 작성하기 때문에 이것을 말합니다. 그런 다음 컴파일러는 클래스에서 유형을 생성하고 런타임은 유형을 사용하여 객체 인스턴스를 만듭니다.

int float, char 등과 같은 C의 유형은 작동 할 수있는 특정 방법으로 작동 할 수있는 데이터를 정의합니다. 그것보다 더 복잡하지 않습니다. int와 마찬가지로 추가 할 수 있습니다. 곱하기를 빼고 나눌 수 있습니다. 그것들은 int에 대한 나의 방법 (또는 운영)입니다. 클래스는 단순히 새로운 유형의 정의입니다. 먼저 데이터가 어떻게 보이는지 정의합니다. 어쩌면 그것은 단일 일 것입니다. 어쩌면 그것은 실제적이고 가상의 부분을 가진 복잡한 두 단어 일 것입니다. 또는 목성에 이상한 입자의 원자 메이크업을 나타내는 309734325 바이트가있는이 복잡한 것일 수도 있습니다. 상관 없어요. 정수와 마찬가지로이 새로운 데이터 유형으로 수행 할 수있는 작업을 구성합니다. 정수의 경우 추가, 빼기 등이 새로운 데이터 유형을 사용하면 내가 생각하는 작업을 정의 할 수 있습니다. 그들은 빼기 등을 추가 할 수 있지만 다른 것들을 추가 할 수 있습니다. 이것들은 내가 수업에 추가하기로 결정한 방법입니다.

결론은 C의 유형을 사용하면 데이터가 무엇인지에 대한 정의가 있다는 것입니다. 바이트, 단어, 플로트, 숯 등. 그러나 이들 중 어느 것도 합법적 인 작업이 합법적이며 신뢰할 수있는 결과를 생성 할 것입니다.

인터페이스와 허용 가능한 작업을 정의하는 것이 귀하에게 달려있는 것을 제외하고 클래스는 다르지 않습니다. 클래스는 이러한 것들을 정의하고 객체에 인스턴스화 할 때 유형 정의와 마찬가지로 객체의 동작을 정의 할 때 정수의 동작을 정의합니다.

수업은 새로운 유형을 정의 할 수있는 유연성과 작동 방식에 대한 모든 것을 제공합니다.

이것이 정의되면, 클래스 "thingy"의 객체를 인스턴스화 할 때마다, 내가 정의한 데이터 구조와 내가 할 수 있다고 말한 작업 (메소드)이 있습니다. "Thingy"클래스는 C ++를 정의 할 수있는 새로운 유형 이상의 것이 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top