2013-07-08 3 views
-1

이 질문의 목적 상 가능한 오류 값을 나타내는 간단한 Error 기본 클래스가 있습니다.런타임 중에 기본 클래스의 인스턴스를 파생 클래스로 대체하는 방법

나는이 Error 기본 클래스에서 여러 오류 값을 가질 수 있도록 int List가있는 ErrorMultiple 클래스에서 파생되었습니다.

Error 클래스의 단일 인스턴스를 유지하려는 Event 클래스가 있습니다.

그래서 이벤트의 인스턴스를 만들고 여러 가지 방법으로 전달합니다. 이것들 중 하나는 "아뇨. 우리는 거기에 여러 오류가보고 있음을 발견했다. "

가 어떻게이 오류 기본 클래스 인스턴스의 폐기하고 (A Event.ReplaceErrorObjWithMultipleErrorObj를 통해 ErrorMultiple 클래스의 인스턴스로 대체 내 이벤트 객체를 얻기 위해 코드를 작성할 수 있습니다)

public class Error 
{ 
    protected int ErrorNo; 
} 
public class ErrorMultiple : Error 
{ 
    Protected List<int> MultipleErrorNos; 
} 
public class Event 
{ 
    Error * errorObject; 
} 

Public Event() 
{ 
    errorObject = new Error(); 
} 

void Event.ReplaceErrorObjWithMultipleErrorObj() 
{ 
    errorObject = new ErrorMultiple(); 
} 

는 물론 이벤트 선언은 사실 C의 # 구문 쓰레기입니다 내가 교체 객체 인스턴스에 대한 참조를 선언하는 방법을 모르는

+0

나는 느낌을 받고 있어요 당신 ' 다시 C++ 사용자가 C#을 사용하려고 시도하고 어떻게 지내야하는지 모릅니다. 포인터없는 anage 객체. – Pharap

+0

Yip. 당신은 그것을 하나에 못 박았습니다. 나는 우리가 모두 한 번 배워서 영원히 사용할 수있는 최고의 프로그래밍 언어가 있었으면 좋겠다. – kingchris

+0

나는 C++과 C# 모두에서 경험이 있기 때문에 자리 잡기가 너무 어려웠다. 간단한 설명을 시도해 보겠습니다.하지만 실제로는 값 유형과 참조 유형의 차이점을 읽어야합니다. – Pharap

답변

1

문제 # 01 -.. 값 유형 및 참조 유형 C에서 ++ , 객체는 값 유형 - 구성 요소의 구조입니다. 참조하려면 ce에 값을 메모리에 살고, 당신은 포인터를 사용합니다. C#은 이런식이 아닙니다. C#에서는 객체가 기본적으로 참조되며 객체와 관련된 값 유형은 없습니다.

ErrorClass* error = new ErrorClass(); 

주요 차이점 그러나 :

ErrorClass error = new ErrorClass(); 

가 ++ C이 상당이된다

C#으로이 있다는 것을 의미한다 (즉, 거짓의 비트가이 간단을했다) C++에서 포인터를 역 참조 할 수있는 것처럼 C# 참조를 역 참조 할 수있는 방법이 없다는 것입니다.

또한이 C#에서 :

error.ErrorNumber = 0; 

는 C에서이 동일합니다 ++ :

error->ErrorNumber = 0; 

효과적으로 무슨 일이 일어나고 것은 모든 포인터 마법 방지하기 위해 사용자로부터 은폐되고 있음이다 포인터 오류가 발생하지 않도록하고 포인터 관리가 관리되는 언어의 가비지 수집 (객체가 끝나면 객체를 삭제하는 시스템, 즉 범위를 벗어나는 시스템)을 방해하지 않도록합니다.

# 02 - 구문 C#에서는 컴파일러가 C++과 약간 다릅니다. 진정한 정의와 매크로 같은 몇 가지 기능이 없지만 더 지능적이고 덜 엄격합니다.

첫째, 클래스는 모든 필드와 메소드를 하나의 블록에 완전히 포함해야합니다. 클래스의 기본 구조를 선언하고 나중에 사물의 정의를 선언 할 수는 없습니다.즉, 당신은이 작업을 수행 할 수 없습니다

class ErrorClass { public: void PrintError(); } 
void ErrorClass::PrintError() { printf("error"); } 

을하는 방법에 대한 정의는 클래스의 몸 안에 있어야하기 때문에,과 같이 : 당신은 그러나의 이름을 선언 할 필요는 없습니다

class ErrorClass { public void PrintError() { Console.Write("error"); } } 

함수를 사용하기 전에 컴파일러는 반드시 작성된 순서대로 코드를 읽지는 않습니다. ,

public class Error 
{ 
    protected int ErrorNo; 
} 
public class ErrorMultiple : Error 
{ 
    protected List<int> MultipleErrorNos = new List<int>(); 
} 
public class Event 
{ 
    Error errorObject = new Error(); 
public void MultiplyErrors() 
{ 
    errorObject = new ErrorMultiple(); 
} 
} 

는 첫째, 오류 번호가가 보호되기 때문에 읽을 수 없습니다 유의하시기 바랍니다 :

당신이 일을 보는 방법을 볼 수 있도록 나는 적절한 C#을 양식에 코드를 다시 작성하며, 모든 것을 요약하면 두 번째로 C#은보다 최신의 C++과 유사한 try, catch, finally 및 throw 문을 사용하는 예외 기반 시스템을 사용합니다.

연구 교재 :

+0

감사합니다. new()를 사용하여 즉석에서 errorObject를 대체 할 수 있다는 것을 알고 있으며 가비지 수집기는 이전 오류 객체 참조를 정리합니다. – kingchris