2013-10-08 3 views
8

이것이 가능한지 모르지만 파생 클래스에서 기본 클래스 인스턴스를 가져 오려고합니다. C#에서는 베이스 키워드를 사용하여 기본 클래스의 속성 및 메서드에 액세스 할 수 있지만 베이스 자체를 사용하고 싶습니다. 이렇게하면 ""키워드 'base'사용이이 컨텍스트에서는 유효하지 않습니다. " 오류.파생 클래스에서 기본 클래스 인스턴스를 얻는 방법

예제 코드

public class SuperParent 
{ 
    public int SPID; 

    public SuperParent() 
    { 
    } 
} 

public class SubChild : SuperParent 
{ 
    public SubChild(int pSPID) 
    { 
     base.SPID = pSPID; 
    } 

    public int BaseSPID 
    { 
     get 
     { 
      SuperParent sp = base; 
      return sp.SPID; 
     } 
    } 
} 
+7

코드 단편은 1000 단어의 가치가 있습니다. 달성하고자하는 내용의 스 니펫을 제공해주십시오. – ppeterka

+0

코드를 보여 주시겠습니까? 내가하고있는 일을 잘 이해하지 못해서 고마워요. –

+1

@TimSchmelter OP가 그것에 대해 알고 있지만, 그가 원하는 것이 분명하지 않습니다. 아마도 [ "return base;"]와 같은 라인을 따라 뭔가있을 수 있습니다. (http://stackoverflow.com/questions/14482799/return-base-class -in-c-sharp) – ppeterka

답변

14

당신이 파생 클래스의 인스턴스와 작업하는 경우가 더 base instance이 없습니다. 예 :

class A 
{ 
    public void Foo() { ... } 
} 

class B : A 
{ 
    public void Bar() { ... } 
} 

B 내 수 없습니다 무엇 :

public void Bar() 
{ 
    // Use of keyword base not valid in this context 
    var baseOfThis = base; 
} 

당신은 같은 것을 수행 할 수 있습니다

public void Bar() 
{ 
    base.Foo(); 
} 

을 그리고 당신은

public A GetBase() 
{ 
    return (A)this; 
} 
같은 다른 방법을 추가 할 수 있습니다

그리고 당신 그래서이 GetBase() 방법은 당신이 원하는 아마

public void Bar() 
{ 
    var baseOfThis = GetBase(); 
    // equal to: 
    baseOfThis = (A)this; 
} 

수 있습니다.

뒤통수 때리는 웃긴이다 : 당신이 B의 인스턴스가있는 경우, 모든 속성과 A의 비 오버라이드 (override) 동작을 상속하지만, 그것은에 (숨겨져 있지만 자동) 참조를 보유하고 B의 인스턴스 구성하지 않습니다 A의 인스턴스입니다. B 인스턴스를 A으로 전송할 수 있지만이 인스턴스는 B의 인스턴스로 유지됩니다.

0

문제가있을로 명확로 설명되지 않았습니다. 그러나 일반적으로 추상 기본 클래스와 메서드를 사용하고 필요한 메서드를 재정의하는 것이 좋습니다. 이 경우 필요한 경우 base.method를 사용할 수 있습니다 (그렇지 않으면 파생 클래스의 인스턴스를 회전 시켰을 것입니다).

public abstract class foo { 

    public virtual void bar(){..} 
} 

public class footwo : foo { 
    public override void bar(){ 
     // do somethng else OR: 
     return base.bar(); 
    } 
} 

}

0

파생 된 인스턴스는 기본 인스턴스입니다. 메모리에있는 하나의 객체 인스턴스입니다.

예 :

public class A : B 
{ 
} 

var thing = new A(); 

thingA의 인스턴스이며, 또한 B의 인스턴스이다.
당신은 예를 들어,이 줄을 작성할 수
B thing2 = thing;

3

그럼 당신은 당신의 질문에 대한 코드를 제공하지,하지만 난 당신이

class Base 
{ 
    public virtual void Foo() 
    { 
     Console.WriteLine("base"); 
    } 
} 

class Derived : Base 
{ 
    public override void Foo() 
    { 
     Console.WriteLine("derived"); 
    } 

    //// bad 
    //public Base MyBase 
    //{ 
    // get 
    // { 
    //  return base; // Use of keyword 'base' is not valid in this context 
    // } 
    //} 

    // work but... 
    public Base MyBase 
    { 
     get 
     { 
      return (Base)this; 
     } 
    } 
} 

같은 것을 원하는 supsect 그러나 MyBase 정말의 있음을 유의하십시오 Derived

new Derived().MyBase.Foo(); // output "derived" 
0

포인트 1을 입력 : 당신이 더보다 자식 클래스에서 기본 클래스의 인스턴스를 생성하지하려면 가치가있다. 이미 아이에게 공개 된 것들이 있습니다.

포인트 2 : 초기화 된 하위 클래스가 있고 이제 기본 클래스 "인스턴스"를 가져 오려면 초기화되지 않은 경우 어떻게 가져올 수 있습니까? 이제 기본 클래스 인스턴스가 실제 메모리에 없기 때문에 거기에 자식 클래스 인스턴스가 있습니까?)

0
class Parent 
{ 
     private Parent _parent; 
     public Parent() 
     { 
     _parent = this; 
     } 

    protected Parent GetParent() 
    { 
     return _parent; 
    } 
} 

class Child : Parent 
{ 
    private Parent _parent; 
    public Child() 
    { 
     _parent = base.GetParent(); 
    } 
} 
+0

코드의 유용성 여부에 관계없이 ** 명확하고 자세한 설명 ** 없이는 질문에 대답하지 않습니다. – Enigmativity