2013-08-02 4 views
-1
I came across a lot of code in our company codebase with the following structure 



    class Base 
    { 
    public Base (var a, var b) 
    { 
     base_a = a; 
     base_b = b; 
    } 

    var base_a; 
    var base_b; 
    } 

    class Derived:Base 
    { 
    publc Derived (var a,b,c,d): base (a,d) 
    { 
     der_c = c; 
     der_d = d; 
    } 
    var der_c; 
    var der_d; 
    var der_e; 
    } 


    class Ref 
    { 
    Base _ref; 
    public Ref(var a,b,c,d) 
    { 
     _ref = new Derived (a,b,c,d) 
    } 

    public void method() 
    { 
     _ref.der_e = 444; // won't compile 
    } 
    } 

der_e를 초기화하는 올바른 방법은 무엇입니까? _ref에 대해 기본 클래스 참조 및 객체 파생 클래스 사용의 장점은 무엇입니까? 사실 기본 클래스 참조를 사용하면 여러 파생 클래스 객체를 보유 할 수 있다는 사실입니까? 그렇다면, 파생 클래스의 모든 멤버 변수를 생성 중에 초기화해야합니다 (예 : _ref = new Derived (a, b, c, d)). 나중에 메서드에서 _ref.der_e를 초기화하려면 어떻게해야합니까? 나는 이것을 할 수 있다는 것을 알고있다. (var cast_ref = _ref as Derived; cast_ref.der_e = 444)하지만이 예제는 모범 사례로 보이지 않는다. 그러한 구조를 갖는 아이디어는 무엇이며, 파생 된 클래스 객체가 생성 된 후에 그 객체의 멤버를 초기화하는 것이 옳은 것은 무엇입니까?기본 클래스 참조 객체를 사용하여 파생 클래스 멤버 변수 초기화

+0

전혀 컴파일되지 않습니다 준 코드 - 당신은 사용할 수 없습니다 'var' 매개 변수 나 필드에 대해 (실제로'var'라고하는 클래스가 없다면). 현실적인 * 예제를 제공하십시오 - .NET 명명 규칙에 따라 더 짧고 이상적으로 형식을 지정하십시오. –

답변

0

하나의 게시물에 너무 많은 질문이 있습니다.

der_e를 초기화하는 올바른 방법은 무엇입니까? der_e 초기화

당신은 Base 클래스를 der_e 속성에 대해 알고하지 Derived 클래스의 참조를해야합니다.

베이스 클래스 참조를 갖는 목적 _ref 유래의 클래스를 사용하는 장점은 무엇인가?

예, 객체 지향 프로그래밍의 핵심 인 Polymorphism입니다. 실제 구현을 모른 채 다양한 구체화 된 구현을 유지할 수 있습니다. 그런 경우에는

파생 클래스 모든 멤버 변수 (이 같은 _ref = 새로운 파생 (A, B, C, D)) 소재 자체 동안에 초기화되어야

그런 규칙은 없습니다. 시나리오에 따라 다릅니다. 오브젝트의 작성 후에 값을 변경하는 것이 아니고, 오브젝트의 작성 중에 값을 알고있는 경우는, 오브젝트를 구축 중에 초기화 할 필요가 있습니다.

가끔씩 값이 알려져 있거나 때로는 그렇지 않은 경우와 같은 다양한 시나리오가있는 경우 다른 인수를 사용하는 오버로드 된 생성자가있을 수 있습니다.

나중에 _ref.der_e를 메소드에서 초기화하고 싶습니다.

이것은 완벽하게 훌륭합니다. 달성하려는 목표에 따라 다릅니다. 질문은 구체적인 것만이 아니라 달성하려는 것에 대해 논평하기 어려운 추상적 인 것입니다.

는 나는이 (VAR cast_ref = _ref 파생로서 cast_ref.der_e = 444)을 수행 할 수 있습니다 알고 있지만이보기는 가장 좋은 방법으로 보이지 않는다.나는 대답은 매우 될 수 있다고 생각대로

나는, 내가이 당신을 도움이 될 몇 가지 참조를 공유하고

//This class knows about Base and nothing about the Derived class 
class UserOfBase{ 

    Base ref; 

    //Constructor of UserOfBase gets passed an instance of Base 
    public UserOfBase(Base bInstance){ 
     this.ref = bInstance; 
    } 

    //Now this class should not cast it into Derived class as that would not be a polymorphic behavior. In that case you have got your design wrong. 

    public void someMethod(){ 
     Derived derivedRef = (Derived)ref; //This should not happen here 
    } 

} 

자바 배경에서 오전으로 C#을 유사하다 일부 자바 코드를 공유하고 설명하기가 길어요.

+0

public void someMethod() { 파생 된 derivedRef = (파생 된) ref; // 이것은 여기에서 일어나서는 안된다 } 당신은 이것이 생성자와 동일하다고 말하면서 public UserOfBase (int a) { this.ref = new Derive (a); } – cyrux

+0

@cyrux 예'UserOfBase'가 구체적인 파생 클래스 인스턴스를 인스턴스화해서는 안됩니다. 베이스에 대해서만 알면되고 다른 것에 대해서는 알 필요가 없습니다. Dependency Injection을 참조하십시오. 이것은'UserOfBase'에 종속성을 주입하는 것입니다. –

관련 문제