2013-06-18 6 views
2

문자열 ('이름')과 기능 사전 ('기능')이있는 클래스가 있습니다. 인스턴스는 파일에서 이름을 검색하고 거기에서 기능을 가져 와서 구성됩니다. 코드의 다른 부분에 사전에 추가 기능을 추가하고 있습니다. 내가 알고 싶은 것은 자식의 생성자에서 부모 개체의 인스턴스를 사용할 수 있습니까?자식 생성자 (C#)에서 기본 개체 사용

예.

public parentClass(string name) 
{ 
    this.name = name 
    this.features = ... gets features from file ... 
} 

public childClass(parentClass parentObject, feature extraFeatureValue) 
{ 
    childObject = parentObject??? 
    this.features[extraFeature] = extraFeatureValue 
} 

이후, 나는
가) 추가 기능을 가진 객체에 대한 새로운 클래스를 가져야한다고 가정하고, 그래서 어떤
B)는 새 클래스에게 이전의 자식을 어떤 알 수 있습니다 그것은 단지 몇 가지 추가 기능, 그리고 내가 방법

덕분에 내가 알고 싶은 것이

답변

0

이전의 대답 (지금 삭제는) 내가 무엇을 찾고 있었다이었다.

http://msdn.microsoft.com/en-us/library/ms173116(v=vs.80).aspx

그래서 부모 클래스에 다음 중 하나를 추가 한 다음 자식 클래스를 확장 할 수

public Animal(Animal previousAnimal) 
{ 
    this.name = previousAnimal.name; 
    this.features = previousAnimal.features; 
} 

public Fish(parentClass animal, bool isSaltwater) 
    : base(parentClass animal) 
{ 
    this.features[SaltWaterFish] = isSaltwater; 
} 
5

을 유지하려면, 그것은 단점에 부모 개체의 인스턴스를 사용할 수 있습니다 아이를위한 생성자?

예, 가능합니다. base 키워드를 사용하십시오. 또한 부모 인스턴스를 자식 생성자에 전달할 필요가 없다는 점에 유의하십시오. 새 Child 인스턴스를 만들면 부모의 기본 생성자가 암시 적으로 호출됩니다. 기본 클래스의 사용자 지정 생성자를 호출하려면 자식 생성자에서 기본 클래스 생성자를 호출합니다. 아래 샘플에서와 같습니다.

MSDN의 생성자에 대해 자세히 알아볼 수도 있습니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     Parent p = new Child(); 
    } 
} 

class Parent 
{ 
    public Parent() 
    { 
     SomeBaseProp = "BaseProperty"; 
    } 

    public Parent(string name) 
    { 
     SomeBaseProp = name; 
    } 
    public string SomeBaseProp { get; set; } 
} 

class Child : Parent 
{ 
    public Child() 
    { 
     Console.WriteLine(base.SomeBaseProp); 
    } 

    public Child(string someString) : base(someString) 
    { } //this will call the custom constructor of your base class before constructing this child class 

    public int SomeChildProp { get; set; } 
} 
+0

내가 부모 클래스의 생성자를 호출하고 싶지 않았다; 이미 생성 된 부모 객체를 인수로 전달하려고했습니다. 이전 답변에서 '복사 생성자'에 대해 언급했습니다. 이는 내가 확실하지 않은 것입니다. 그것은 지금 삭제 된 것으로 보이지만 그것은 제가 찾고 있던 대답이었습니다. 고마워. – Ollyver

0

귀하의 코드에서, 당신은 당신의 자녀 클래스에서 귀하의 부모 클래스 생성자를 사용하는 방법을 묻는 것 같습니까?

이 같은 기본 생성자를 호출 할 수 있습니다

public ChildClass(string name, Feature extraFeature) 
:base(name) //this initializes this class with the constructor of the base class 
{ 
    Features.Add(extraFeature); //this adds your extraFeature to the features-list. 
} 

allthough, 나는 완전히 당신의 질문을 이해하는 데 어려움을 겪고 않습니다. 예를 들면; 이 추가 기능을 ChildClass의 컨스트럭터로 전달해야한다면 부모 클래스에 AddFeature 메서드를 제공하는 것이 좋지 않을까요?

또는 ChildClass에 추가되는 기능이 항상 동일한 경우 (생성자 매개 변수로 필요하지 않은 경우)?

은 클래스의 이름 매개 변수이며 기능 목록은 실제로 호출 할 메소드 목록 일뿐입니다. 그렇다면; 리플렉션을 사용해 보셨습니까?

편집; 내 상황에 따라 달라질 :

public class FeatureObject 
{ 
    public String Name { get; private set; } 
    public Dictionary<String,String> Features { get; private set; } 


    public FeatureObject (string name) 
    { 
     Name = name; 
     Features = new Dictionary<String, String>(); 
     Features.Add("Name",name);//just an example of a feature that all objects have 
    } 
} 

public class Fish: FeatureObject 
{ 
    public Color Color { get; private set; } 

    public Fish(String name, Color color) 
    :base(name) //initializes Name and Features as described in FeatureObject-class 
    { 
     Features.Add("Color", color.ToString());//Adds color to the features-dictionary 
    } 
} 

나는 아직도 당신이 쉽게 할 수 있다고 생각합니다.

예를 들어,이 방법은 개체의 명명 된 속성의 문자열 표현을 반환하려고합니다 :

public static String GetPropertyValue(object o, String property) 
{ 
    try 
    { 
     return o.GetType().GetProperty(property).GetValue(o, null).ToString(); 
    } 
    catch(Exception) 
    { 
     return null; 
    } 
} 

을 당신이 사전 객체에 객체가있는 경우,이 같은 방법을 가져올 수 있습니다 '복사 생성자가'가능, 인수와 같은 유형의 다른 개체를 촬영 한 :

public static String GetPropertyValue(String objectName, String propertyName) 
{ 
    try 
    { 
     var o = Objects[objectName]; 
     return GetPropertyValue(o, propertyName) 
    } 
    catch (Exception) 
    { 
     return null; 
    } 
} 
+0

제안 해 주셔서 감사합니다. name 매개 변수는 개체의 이름이었습니다. '물고기'라고 말하면 '크기', '색상'과 같은 기능을 사용할 수 있습니다. (따라서 기능은 사전입니다.) 따라서 추가 기능은 항상 동일한 기능이지만 다른 값을 사용할 수 있습니다. 기능 목록이 정적 인 관계로 표준 기능 목록이있는 개체와 확장 목록이있는 개체에 대해 서로 다른 클래스를 갖기를 원했습니다. 구조가 합리적인 것처럼 보입니까? – Ollyver

+0

(목록과 사전에 대한 혼란에 대한 사과 - 내 머리 속에 '목록'에 대한 프로그래밍되지 않은 정의를 사용하고 있는데 도움이되지 않습니다.) – Ollyver

관련 문제