2011-12-09 3 views
1

저는 최근에 클래스 상속을 연구 해왔고이 특정 코드를 계속 다루었습니다. 이 방법을 만들 수 왜 여기에서 저를 혼동하는 것은 그것은 나를라면 내가 형의 바에서 바의 인스턴스를 만들 것이다"파생 클래스"유형의 객체 만들기

public class Foo {  

public bool DoSomething() 
{ 
    return false; 
} 
} 

public class Bar : Foo { 

public new bool DoSomething() 
{ 
    return true; 
} 
} 

public cass Test { 

    public static void Main() { 

    Foo test = new Bar(); 

    Console.WriteLine (test.DoSomething());  
    } 
} 

은 ...

Bar test = new Bar(); 

이해가 안 돼요 그것은 코드에 있습니다.

+1

당신이 찾는 답은 BrokenGlass의 대답과 다형성과 혼합 된 저스틴의 답이 어딘가에 있습니다. 불행히도 그러한 의미에 대한 간단한 대답은 없습니다. Factory Patterns, IoC 또는 Dependency Injection에 익숙해 져야합니다. 공장 패턴이 아마도 가장 쉬운 방법 일 것입니다. 경험이 없다면, 당신은 복잡한 세부 사항을 무너 뜨리는 책이 필요합니다. 헤드 퍼스트 디자인 패턴은 탁월한 선택입니다. –

답변

3

: 그냥 운전에 대해 걱정할 필요가 Foo 변수는 기본 클래스 메서드 DoSomething()을 사용하고 false을 출력합니다. DoSomething 방법은 기본 클래스에서 가상으로 선언되었고 출력은 다음 예에서와 같이 true 될 것 파생 클래스에서 재정의 된 : 덜 일반적으로

public class Foo {  

public virtual bool DoSomething() 
{ 
    return false; 
} 
} 

public class Bar : Foo { 

public override bool DoSomething() 
{ 
    return true; 
} 
} 
+0

코드의 목적을 알고 있지만 이해할 수없는 것은 하위 클래스의 인스턴스를 만들 때 참조로 수퍼 클래스를 사용한다는 것입니다. 슈퍼 클래스 메소드가 가상이라면 실제로 어떤 이점이 있습니까? – Zizo47

+0

대부분의 다른 답변은 구체적인 클래스 대신 기본 클래스 (및 인터페이스)를 사용하면 얻을 수있는 이점에 대해 자세히 설명합니다. 구체적인 내용 대신 추상화에 의존하려는 경우 나중에 실제 구현을 변경할 수 있습니다. - 이것이 다형성의 기초이며 IoC/Depedency Injection과 같은 것들을 훨씬 더 강력하게 만듭니다. – BrokenGlass

0

일반적으로 그렇지 않습니다. 더 현실적인 예는이 경우

void DoSomethingWithAFoo(Foo f) { 
    f.DoSomething(); 
} 

, fFoo 또는 Bar이 될 수있을 것이며, DoSomethingWithAFoo은 알거나 관리 할 필요가 없습니다.

0

BarFoo에서 파생되므로 Bar의 인스턴스를 만들고 Foo- 참조로 할당하는 것이 완전히 유효합니다. 나는 당신이 보여준 예제 코드가 BarFoo이고 따라서 할당 가능하다는 것을 보여주는 것으로 의심된다.

1

실제 개체에서 이러한 것들을 생각하는 것이 더 쉽습니다.

자동차에 대해 생각해보십시오. 당신은 차종/모델이 다를 수 있지만 각 차는 동일한 기본 기능을 수행합니다.

코드는 동일한 방식으로 개체에 사용할 수 있습니다. 당신은 어떤 차와 함께 작동하도록 코드를 작성,하지만 당신은 정말 당신이 원하는 자동차의 제조사/모델을 지정할 수 있습니다, 지금

public class Car 
{ 
    public virtual void Drive() 
    { 
    } 
} 

public class ChevyVolt : Car 
{ 
    public override void Drive() 
    { 
     // Initialize the battery and go 
    } 
} 

public class CadillacEscalade : Car 
{ 
    public override void Drive() 
    { 
     // Check to ensure you have an oil field worth of gas and go 
    } 
} 

을 그 정의를 ... 당신이 차를 운전을 담당하는 클래스를 만들 수 있습니다. 어떤 차가 중요하지 않습니다. 를 사용하여 Bar 객체를 인스턴스화이 경우

:이 코드는 아마 의 차이는 기본 클래스 메서드를 숨기고 및 을 무시 입증하기 위해 작성되었습니다

public class Commuter 
{ 
    public void GoToWork() 
    { 
     // Garage.PickCar() could return either ChevyVolt or an Escalade 
     Car todaysRide = Garage.PickCar(); 

     // Now that we have a car, go to work 
     todaysRide.Drive(); 
    } 
} 
0

당신은 더 일반적인 (푸)를 할당 할 수 있습니다 type (Boo) 이것은 대개 다형성을 활용할 때 수행됩니다. 고전적인 예가 Animal, Dod 및 Cat을 갖고 있고 Animal=new Dog() 또는 Animal=new Cat()이라고 말하면 가상 함수를 호출하고 적절한 함수가 자동으로 호출되도록 할 수 있습니다. 새로운 기능으로 DoSomething 함수를 겹치기 때문에이 경우가 아닙니다 ...

0

Foo에 정의 된 기능 만 원한다고 생각하면 더 많은 의미가 있습니다. BarBar이 무엇이든간에 더 많은 기능을 추가 할 수 있습니다.

public class Bar : Foo { 

public new bool DoSomething() 
{ 
    return true; 
} 

public bool IsValid {get;} 
} 

지금 호출 코드는 사실에도 불구하고 당신이 Bar를 만드는, 그래서 Foo에 의해 정의 된 추상화에 대한 관심, 당신 Foo (단지 DoSomething)에 의해 정의 된 계약 때문에하지 Bar.IsValid 기능 I를 얻으려면, 한정된.