OOP의 상속 개념을 설명하려고 할 때 일반적인 예는 종종 포유류 예입니다. IMHO, 이것은 초보자 가이 개념을 잘못된 방식으로 사용하게하기 때문에 실제로 나쁜 예입니다. 또한 일상적인 디자인 작업에서 직면하게되는 것은 일반적인 디자인이 아닙니다.
그렇다면 상속을 사용하여 해결되는 훌륭하고 간단하며 구체적인 문제는 무엇입니까?
OOP의 상속 개념을 설명하려고 할 때 일반적인 예는 종종 포유류 예입니다. IMHO, 이것은 초보자 가이 개념을 잘못된 방식으로 사용하게하기 때문에 실제로 나쁜 예입니다. 또한 일상적인 디자인 작업에서 직면하게되는 것은 일반적인 디자인이 아닙니다.
그렇다면 상속을 사용하여 해결되는 훌륭하고 간단하며 구체적인 문제는 무엇입니까?
답변:
포유류와 같은 순수하게 학문적 인 예에는 아무런 문제가 없습니다. 사각형 / 사각형 예제도 좋아합니다. 왜냐하면 실제 분류법이 항상 원하는 상속 관계로 직접 변환되지 않는지를 지적하기 때문입니다.
내 의견으로는, 가장 일상적인 예는 GUI 툴킷입니다. 모든 사람이 사용한 것이지만 초보자가 후드에서 어떻게 작동하는지 추론하지 않았을 수도 있습니다. 주어진 구현에 대한 자세한 지식 없이도 모든 컨테이너, 모든 위젯, 이벤트 등에 공통적 인 동작에 대해 이야기 할 수 있습니다.
실제 사례는 간단한 HR 응용 프로그램의 도메인 모델입니다. 물론 Employee 라는 기본 클래스를 만들 수 있다고 말하지만 물론 관리자도 직원입니다.
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Code { get; set; }
public string GetInsuranceHistory()
{
// Retrieving insurance history based on employee code.
}
}
그런 다음 개발자 는 직원 , 테스터 는 직원 , 프로젝트 관리자 는 직원이라고 설명 합니다. 따라서 직원 클래스에서 모두 상속받을 수 있습니다 .
Employee
이 될 수 abstract
도 클래스입니다.
Developer
와 a 둘 다 여야하는 사람이 최소한 한 명 있기 때문에 실제로는 작동하지 않습니다 Tester
. 또 다른 유사한 상황이 당신이 가지고있는 연락처 데이터베이스입니다 Customer
및 Supplier
하지만 당신을 말할 것이다 이러한 시스템을 만든 사람 같이이 경우 항상 거기 Company
둘 다가. 그렇기 때문에 이러한 예의 대부분이 잘못된 방향으로 안내합니다.
다양한 것을 캡슐화합니다 ... 템플릿 메소드 패턴 을 보여줍니다. 기본 클래스에 공통적 인 동작을 넣고 서브 클래스에서 다양한 동작을 캡슐화하여 상속의 유용성을 보여줍니다.
UI controls
그리고 Streams
또한 상속의 유용성에 대한 아주 좋은 예이다.
객체의 모든 인스턴스는 상속의 유용성에 대한 구체적인 예입니다!
특별히 계급 상속 을 의미한다면 , 지금 당신은 분류법의 세계에 있으며, 그것들을 사용하는 시스템의 목표에 따라 크게 달라질 것입니다. 동물 / 포유류 예제는 생물학에서 일반적이고 잘 알려진 친숙한 분류법을 사용하지만, 언급 한 것처럼 대다수의 프로그래밍 문제에는 거의 쓸모가 없습니다.
따라서 프로그램 개념이라는 보편적 인 것을 시도하십시오. 모든 프로그램이 시작, 실행 및 종료됩니다. 모든 프로그램에는 이름과 선택적 명령 줄 매개 변수가 있습니다. 따라서 기본 Program 클래스는 실행을 시작하고 명령 줄 인수를 가져와 처리하고 기본 논리를 실행하며 정상적으로 종료하는 데 매우 유용합니다.
그렇기 때문에 많은 객체 지향 프로그래밍 언어가 Program 클래스 또는 Program 클래스와 똑같이 동작하는 것을 제공하는 이유입니다.
class Programm { public static void main(String[] args) { system.out.println('hello world'); }}
최소한의 Java 프로그램입니다. 전화하면 Program 인스턴스가 없습니다. 프로그램은 아무것도 상속받지 않습니다. 3 개의 프로세스를 시작하면 (crhome을 사용하는 것처럼) 3 개의 프로그램이있을 수 있지만 개별 메모리 영역에는 여전히 하나의 프로그램 만 있습니다. Imho, singleton은 머신이 아닌 '프로세스 당 하나의 인스턴스 만'을 의미합니다. 그렇다면 싱글 톤을 만들 수 없으며 코드를 두 번 실행하는 것을 막을 수있는 것은 없습니다.
직장에서 카메라로 작업하고 있습니다. 서로 다른 모델에 연결되는 장치가 있으므로 추상 "카메라 클래스"가 있으며 모든 모델은이 클래스에서 상속되어 해당 카메라의 특정 기능을 지원합니다. 실제 사례이며 이해하기 어렵지 않습니다.
Camera
와 Phone
(우리 모두가 지금 우리 주머니에서처럼). 어떤 기본 클래스를 상속해야합니까? 아니면 그냥 인터페이스 ICamera
와 IPhone
인터페이스를 모두 구현해서는 안 됩니까? (ha ha)
이것은 내 두뇌에서 튀어 나온 또 다른 예입니다.
Element_ 클래스 { 이중 원자량; // 원자의 원자량 이중 원자 번호; // 원소의 원자 수 문자열 속성; // 요소의 속성 // 다른 경우 } 동위 원소는 Element_를 확장한다 // 원소의 동위 원소가 존재할 수있다 { 이중 반감기; // 다른 경우 }
isotope
의 특별한 경우가 아닙니다 Elemenet
. 차라리에 Element
속성이 있습니다 Isotope
.
이 항상 모두를있는 뭔가의 가능성 어디 그들은 예를 제공하기 때문에 실제 사례는 거의 항상 잘못을 얻을 TypeA
하고 TypeB
있지만, 많은 언어의 단일 상속 계층 구조가 허용되지 않습니다.
프로그래밍을 많이할수록 상속에서 멀어집니다.
"상속"이라는 단어조차도 여기에 잘못 사용되었습니다. 예를 들어, 아버지 특성의 약 50 %와 어머니 특성의 50 %를 물려받습니다. 실제로 당신의 DNA는 당신의 아버지의 DNA의 절반과 어머니의 DNA의 절반의 구성입니다. 생물학은 실제로 상속보다 구성을 선호 하기 때문 입니다.
단순히 인터페이스를 구현하거나 "덕 타이핑"과 종속성 주입을 구현하는 것이 객체 지향 프로그래밍에 익숙하지 않은 사람들을 가르치는 데 훨씬 좋습니다.
나는 단지 실제 사례를 보여줄 것입니다. 예를 들어, 대부분의 UI 프레임 워크에서는 "Dialog"또는 "Window"또는 "Control"클래스에서 파생되어 사용자가 직접 만들 수 있습니다.
좋은 예는 정렬에서 비교 함수입니다.
template<class T>
class CompareInterface {
public:
virtual bool Compare(T t1, T t2) const=0;
};
class FloatCompare : public CompareInterface<float> { };
class CompareImplementation : public FloatCompare {
public:
bool Compare(float t1, float t2) const { return t1<t2; }
};
template<class T>
void Sort(T*array, int size, CompareInterface<T> &compare);
유일한 문제는 초보자가 너무 자주 성능이 좋은 코드보다 중요하다고 생각한다는 것입니다 ...
내 실제 예는 차량입니다.
public class Vehicle
{
public Vehicle(int doors, int wheels)
{
// I describe things that should be
// established and "unchangeable"
// when the class is first "made"
NumberOfDoors = doors;
NumberOfWheels = wheels;
}
public void RollWindowsUp()
{
WindowsUp = true;
}
// I cover modifiers on properties to show
// how to protect certain things from being
// overridden
public int NumberOfDoors { get; private set; }
public int NumberOfWheels { get; private set; }
public string Color { get; set; }
public bool WindowsUp { get; set; }
public int Speed { get; set; }
}
public class Car : Vehicle
{
public Car : base(4, 4)
{
}
}
public class SemiTruck : Vehicle
{
public SemiTruck : base(2, 18)
{
}
}
이 예제는 원하는대로 자세하게 얻을 수 있으며, 가르치고 자하는 모디파이어의 사용법을 설명하기 위해 차량에 부착 된 모든 종류의 속성이 있습니다.
이 비 포유류, 비 조류, 비 물고기 예는 다음과 같은 도움이 될 수 있습니다.
public abstract class Person {
/* this contains thing all persons have, like name, gender, home addr, etc. */
public Object getHomeAddr() { ... }
public Person getName() { ... }
}
public class Employee extends Person{
/* It adds things like date of contract, salary, position, etc */
public Object getAccount() { ... }
}
public abstract class Patient extends Person {
/* It adds things like medical history, etc */
}
그때
public static void main(String[] args) {
/* you can send Xmas cards to patients and employees home addresses */
List<Person> employeesAndPatients = Factory.getListOfEmployeesAndPatients();
for (Person p: employeesAndPatients){
sendXmasCard(p.getName(),p.getHomeAddr());
}
/* or you can proccess payment to employees */
List<Employee> employees = Factory.getListOfEmployees();
for (Employee e: employees){
proccessPayment(e.getName(),e.getAccount());
}
}
참고 : 비밀을 말하지 마십시오 : 사람은 포유 동물을 확장합니다.
대수 표현의 계층 구조는 어떻습니까? 상속과 구성을 모두 포함하기 때문에 좋습니다.
+--------------------+------------------------+
| Expression |<------------------+ |
+--------------------+----------+ | |
| + evaluate(): int |<---+ | | |
+--------------------+ | | | |
^ | | | |
| | | | |
+--------------+ +---------------+ +-------------+ ...
| Constant | | Negation | | Addition |
+--------------+ +---------------+ +-------------+
| -value: int | | | | |
+--------------+ +---------------+ +-------------+
| +evaluate() | | +evaluate() | | +evaluate() |
| +toString() | | +toString() | | +toString() |
+--------------+ +---------------+ +-------------+
Addition(Constant(5), Negation(Addition(Constant(3),Constant(2))))
(5 + -(3 + 2)) = 0
루트 표현식 Constant를 제외하고 다른 모든 표현식은 모두 표현식이며 하나 이상의 표현식을 포함합니다.
새를 예로 사용하겠습니다
닭고기, 오리, 독수리처럼
나는 발톱, pecks 및 날개가 모두 있지만 설명은 다르지만 그 특성은 다릅니다.
닭은 날 수없고, 수영 할 수없고, 벌레를 먹을 수 있고, 곡물을 먹을 수 있습니다
오리는 날 수없고, 수영하고, 곡물을 먹을 수 있고, 벌레를 먹을 수 없습니다
독수리는 날 수 있고, 수영 할 수없고, 벌레를 먹을 수 있고, 곡물을 먹을 수 없습니다