从派生类访问基类属性

时间:2018-08-31 15:55:16

标签: c# .net

所以我遇到了一个问题,我创建了一个类的对象,该类也有一个派生类,我需要从这些类访问这些属性。实际上,我已经有两个解决此问题的方法,我将在后面介绍。我不确定这是一个有效的问题还是只是代码审查,因为我已经有解决此特定问题的方法。我想我正在寻找更好的解决方案。好吧,让jmp进入这个问题:

所以在我的基类中,我有以下代码:

public class MyBaseClass : IMyInterface
{
    public string myProperty { get; set; }
    public string myProperty2 { get; set; }
    public MyBaseClass(string prop1, string prop2)
    {
       myProperty = prop1;
       myProperty2 = prop2;
    }

    public virtual void PrintProps()
    {
       Console.WriteLine(myProperty + " " + myProperty2);
    }
}

如果我现在从Main创建一个带有参数“ Hello”和“ World!”的此类的对象,然后调用PrintProps方法,我应该在屏幕上看到“ Hello World!”。

代码:

MyBaseClass myBase = new MyBaseClass("Hello!", "World");
myBase.PrintProps();

我现在想做的是创建一个Child类,该类具有完全相同的方法,该方法应该打印出在我的父类中创建的属性。

我想做的事情

public class MyChildClass: MyBaseClass
{
    public override void PrintProps()
    {
        Console.WriteLine(myProperty + " " + myProperty2);
    }
}

然后从Main调用它:

MyChildClass myChild = new MyChildClass ();
myChild.PrintProps();

当我调用子类的printProp方法时,我应该期待“ Hello World!”。要在屏幕上打印,显然不起作用。我知道有两种方法可以解决此问题。解决此问题的第一种方法(不是最面向对象的方法):

public class MyChildClass
{
    MyBaseClass myBase = default;
    public MyChildClass(MyBaseClass myBase)
    {
        this.myBase = myBase;
    }

    public void PrintProps()
    {
        Console.WriteLine(myBase.myProperty + " " + myBase.myProperty2);
    }
}

然后像这样在main中调用它:

MyBaseClass myBase = new MyBaseClass("Hello!", "World");
var myChild = new MyChildClass(myBase);
myChild.PrintProps();

由于我传入了基类的创建的对象,因此这就像一种魅力,但是通过这种方式,我没有使用任何继承,我认为这样做是一种不好的方法。

解决此问题的另一种方法是像这样在我的子类中调用基类构造函数:

public class MyChildClass : MyBaseClass
{
    public MyChildClass() : base("Hello", "World!") { }
    public override void PrintProps()
    {
        Console.WriteLine(myProperty + " " + myProperty2);
    }
}

然后像这样从main调用它:

MyBaseClass myBase = new MyBaseClass("Hello!", "World");
MyChildClass myChild = new MySubClass();
myChild.PrintProps();

这也解决了问题,因此我使用继承和多态性。但是正如您所看到的,我正在Main中创建基类的一个对象,并在派生类中创建另一个对象。但是由于两个对象相同,所以我认为不必创建两个对象。 因此,我希望以某种方式在派生类中使用在Main中创建的对象,而不将其作为argumnet传入。我想使用继承和多态来做到这一点。因此,总而言之,当我继承基类并在子类中使用它时,有可能不“复制”基类的对象吗?还是我必须在main类中创建一个对象,然后在子类中创建另一个对象?我想我可以通过某种方式使用PropertyInfo类来解决此问题,但是我对此并不十分有经验,所以我可能只是想问问不可能的事情。我知道很多东西。任何建议将不胜感激:)。

编辑:我需要在Main中创建基类对象,因为我在Main中同时调用了基类PrintProp方法和子类PrintProp方法,并且我希望这两种方法具有相同的结果。 代码:

MyBaseClass myBase = new MyBaseClass("Hello", "World!");
myBase.PrintProps(); //Expected "Hello World!" to be printed to the screen

MyChildClass myChild = new MyChildClass();
myChild.PrintProps(); //Also expecting "Hello World!" to be printed to the screen

编辑: 更具体地说,我想在Main方法中创建基类的对象。然后,我想从子类访问该对象的属性,而无需将基类作为子类的参数传递,也不需要从子类中调用基类的构造函数,从而创建基类的第二个对象。

因此,如果我从Main传递基类构造函数中的“ 123”,则希望能够从子类访问此属性。因此,在我的孩子课堂中,该属性也应为“ 123”。我不想像这样在我的子类中调用基类构造函数:

 public class MyChildClass : MyBaseClass
 {
    public MyChildClass() : base("123") { }
 }

我认为PropertyInfo是我要寻找的东西,但是我不确定,因为我从未使用过该类。就像我说的那样,我可能(而且很可能是)要求不可能的事情。

1 个答案:

答案 0 :(得分:1)

好的,这很重要:您不能将基类对象传递给子类变量,因为编译器不知道如何“填充”子类的多余部分。 我认为“最佳”方法是在子类中创建一个解析函数:

using System;

public class Base
{
    public string prop1 { get; set; }
    public string prop2 { get; set; }
    public Base(string p1, string p2)
    {
        prop1 = p1;
        prop2 = p2;
    }
    public virtual void print()
    {
        Console.WriteLine(prop1 + " " + prop2);
    }
}

public class cChild : Base
{
    public cChild() : base("", "")
    {
    }
    public override void print()
    {
        Console.WriteLine(Base.prop1 + "......" + Base.prop2);
    }
    public static cChild ofBase(Base papa)
    {
        cChild r = new cChild();
        r.prop1 = papa.prop1;
        r.prop2 = papa.prop2;
        return r;
    }
}

根据类,这可能会变得复杂,但是我认为这是最好的解决方案。

但是,您实际上应该只是尝试在主函数中创建一个子类对象。

或者只是使用界面并使您的孩子可铸造:

using System;

public interface printable
{
    string prop1 { get; set; }
    string prop2 { get; set; }
    void print();
}

public class Base : printable
{
    public string prop1 { get; set; }
    public string prop2 { get; set; }
    public Base(string p1, string p2)
    {
        prop1 = p1;
        prop2 = p2;
    }
    public virtual void print()
    {
        Console.WriteLine(prop1 + " " + prop2);
    }
}

public class cChild : printable
{
    public new static explicit operator cChild(Base A)
    {
        cChild r = new cChild();
        r.prop1 = A.prop1;
        r.prop2 = A.prop2;
        return r;
    }
    public string prop1 { get; set; }
    public string prop2 { get; set; }
    public void print()
    {
        Console.WriteLine(prop1 + "......" + prop2);
    }
}

如果您没有在主函数中创建子对象,它将变得很复杂;)