2016-08-19 4 views
2

클래스 자체의 속성 인 대리자를 사용하여 인스턴스를 조작하려고합니다. 델리게이트의 매개 변수는 항상 인스턴스 자체 여야합니다 (파생 클래스에서도!).파생 클래스 형식을 기본 클래스의 일반 동작 매개 변수로 사용

아래 코드를 참조하십시오. Car1을 유형 자동차에 캐스팅해야하기 때문에 코드가 컴파일되지 않는다는 것을 알고 있습니다. 캐스팅하지 않고 솔루션을 찾고 있습니다.

코드

static void Main(string[] args) 
{ 
    var car = new Car(); 
    car.VehicleManipulator = car1 => car1.SomeInt++; 
    car.ManipulateVehicle(); 

    Console.WriteLine("end"); 
    Console.ReadLine(); 
} 

internal class Vehicle 
{ 
    public Action<Vehicle> VehicleManipulator { get; set; } 

    public void ManipulateVehicle() 
    { 
     this.VehicleManipulator(this); 
    } 
} 

internal class Car : Vehicle 
{ 
    public int SomeInt { get; set; } 
} 

편집 : 변경 코드!

제 질문은 기본 클래스에서이 모든 것을 처리하는 좋은 해결책이 있습니까?하지만 작업에서 캐스팅하지 않고 파생 클래스를 사용하려고합니다.

+0

어디에 문제가 있습니까? 그게 문제라면 모든 클래스 상속을 상속 한 [virtual] (http://stackoverflow.com/q/8309419/1997232) 메서드를 사용할 수 있습니다. – Sinatr

+0

Car.VehicleManipulator 액션은 null입니다. 할당하지 않고 가상으로 만들고 컴파일러는 파생 클래스 –

+0

@ A.T에서 구현을 찾습니다. 반대로 * 속성은 할당되지만 메서드는 * 기본 클래스의 * 속성을 사용합니다. 이것은 NULL에 관한 것이 아니라 상속에 관한 것입니다. –

답변

2

당신이 캐스팅을 피하려면이 같은 차량이 일반적인합니다 : 하나는 오토바이 등

그래서, 코드를 작업하는 같은 것을 할 수 있습니다, 종류 등 만 자동차, 트럭없이 단지 차량을 만들 수 없습니다

class Vehicle<T> where T : Vehicle { 
    Action<T> ManipulateVehicle { get; set; } 
} 

class Car : Vehicle<Car> { 
    int SomeInt { get; set; } 
} 

좀 이상하게 보입니다.하지만 자동차의 인스턴스가있는 경우 조작자가 자동차에서 작동하고 트럭이 있다면 트럭과 같이 작동합니다. 차량은 아마 추상이어야합니다.

4

당신이 가까이 있습니다. 작업이 null이기 때문에이 줄의 NullReferenceException을 가져 오는 이유는 car.ManipulateVehicle();입니다.

enter image description here

그리고 보시다시피 기본 클래스의 VehicleManipulator 속성은 null입니다.

이제 작업을 할당 할 때 실패한 줄 바로 위의 경우 null이 될 수 있습니까? 따라서 문제는 파생 클래스 인 자동차에 새로운 속성이 있고 기본 이름을 숨기는 이름이 VehicleManipulator 인 것입니다. 따라서 car.VehicleManipulator을 할당하면 실제로 파생 클래스에서 기본 클래스가 아닌 속성을 할당하게됩니다.

파생 클래스에서 제거하면됩니다.

아직 이해할 수없는 이유로 파생 클래스에 속성을 유지하려는 경우 할당 할 때

과 같이 기본 클래스에 할당하도록 지정할 수 있습니다.

public Action<Car> VehicleManipulator { get; set; } 

ManipulateVehicle는 기본 클래스의 방법이며 호출 할 때이 VehicleManipulator와베이스 (파생되지 않은) 클래스의 속성을 중국식 팬 :

enter image description here

+0

@Snowcrack -이 일이 무엇을 어떻게 명확하게하고 해결하는 데 도움이 되었습니까? –

0

그냥 자동차 클래스에서 코드 줄을 제거합니다.

파생 클래스에 VehicleManipulator 속성을 추가하면 기본 속성을 숨기고 할당 될 때 - 기본 속성은 따라서 NullReferenceException

나는 또한 그것이 그대로 Vehicle의 서명 키워드 abstract를 추가하는 것이 좋습니다 것 null의 기본값입니다있다 순수 추상화.

abstract internal class Vehicle 
{ 
    public virtual Action<Vehicle> VehicleManipulator { get; set; } 

    public void ManipulateVehicle() 
    { 
     this.VehicleManipulator(this); 
    } 
} 

internal class Car : Vehicle 
{ 
} 
관련 문제