2017-11-26 18 views
-3

나는 분명히해야 할 한 가지. 상속을 사용할 때 가상 또는 대체 키워드를 사용하지 않고 메서드를 재정의 할 수 있습니다. 내 프로그램도 실행 중이고 올바른 결과를 제공합니다. 그렇다면 우리가 상속권을 가지고 있음에도 불구하고 왜 오버라이드 개념을 가지고 있습니까? 그것이 어떻게 다른가요?상속 및 재정의. C#의 차이점은 무엇입니까?

static void Main(string[] args) 
{ 

InheritanceDemo a = new A1(); 
A1 b = new A1(); 
a.Mymeth(); 
b.Mymeth(); 

} 

출력 :

이이

를 도출베이스

인이

+1

'a' 대신'InheritanceDemo' ('InheritanceDemo b = new A1();')로'b'를 선언하면 그것을 얻을 수 있습니다. – Dmitry

답변

0

함수 오버라이드는 여기

class InheritanceDemo 
{ 
public void Mymeth() 
{ 
Console.WriteLine("this is base"); 
} 
} 

class A1 : InheritanceDemo 
{ 

public void Mymeth() 
{ 

Console.WriteLine("this is derived"); 
} 
} 

주요 방법 내 코드 파생 클래스 함수가 ​​기본 클래스 함수보다 많거나 다른 작업을 수행해야 할 때 필요합니다.

이러한 개념은 문제가 큰 대규모 응용 프로그램에서 중요해 지므로 먼저 추상 클래스를 만듭니다 (직접 구현보다는 상황에 대한 아이디어를 제공함). 이러한 추상 클래스는 그룹의 모든 구성원이 구현해야하는 가상 메서드 (멤버 함수)를 포함 할 수 있습니다 (파생 클래스에서 가상 메서드를 정의해야 함). 나는 내 생각을 가지고 있다고 생각한다. :)

+0

감사합니다 !!그래, 그것을 얻었다 :) – javababy

0

출력이 "정확하다"고 생각하는 이유는 무엇입니까? 상속을 사용하여 올바른 을 상속받은 함수와 이 아닌을 기본 클래스의 메서드라고합니다. 그리고 그것은 당신이 virtual/override로 정의한 것입니다.

+0

네, 알았어요. 고맙습니다! – javababy

0

이것을 컴파일하면 경고 CS0108이 있어야합니다.

경고를 무시하지 마십시오. 실제로, 경고보다는 컴파일로 컴파일을 설정할 수 있다면. 경고는 일반적으로 나쁜 점이나 불명확 한 점을 지적한 것입니다. 처음에는보기가 좋지 않거나 불분명 해 보이는 좋은 이유가있을 수 있으므로 오류가 아닙니다. 무시하는 대신 숨기기의 경우는 new입니다.

당신이 여기에있는 것은 재정의가 아니지만, 예상했던대로 대체로 여기에 원하는 것이 대체됩니다. 이것이이 코드가 컴파일러 경고를 생성하는 이유 중 일부입니다.

내 프로그램은 실행하고 올바른 출력을 제공

어쩌면 그것은 맞습니다,하지만 재정의를 예상 경우가 정확하지 않습니다. 재정의하는 경우 두 가지 모두에 의해 "이것은 파생 된"결과를 가져야합니다.

사람들이 일반적으로 무시할 것으로 예상되기 때문에 잘못된 디자인입니다. A1.Mymethpublic new void Mymeth()으로 변경하여 경고를 중지 할 수 있습니다.이 표시 방법은 "실제로이 문제를 잘못 처리 한 것입니다."라고 플래그를 지정하는 방법이지만, 자신을 설명해야한다면 나쁜 신호입니다. 숨어있는 메소드는 일반적으로 누군가 당신 밑에서 기본 클래스를 변경하면 손을 내밀 때 일종의 상호 운용성과 다른 매우 드문 경우가 있기 때문에 이름을 일치시켜야 할 때만 수행됩니다.

+0

감사합니다. 나는 약간 바보 같았다. 나는 지금 포인트를 얻었다! – javababy