从派生类访问基类属性

问题描述 投票:-1回答:1

所以我遇到了一个问题,我创建了一个类的对象,这个类也有一个派生类,我需要访问这些属性。我实际上已经有两个解决这个问题的方法,我将在后面介绍。我不确定这是否会被视为有效问题或只是代码审查,因为我已经有解决这个特定问题的方法。我想我正在寻找更好的解决方案。那么让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中创建baseclass对象,因为我在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是我正在寻找的,但我不确定,因为我从未使用过该类。就像我说的那样,我可能(并且很可能是)要求不可能的事情。

c# .net
1个回答
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;
    }
}

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

但你真的应该尝试在main函数中创建一个子类对象。

或者只是使用接口并使您的孩子可以施放:

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);
    }
}

如果你没有在main函数中创建一个子对象,它就会变得复杂;)

© www.soinside.com 2019 - 2024. All rights reserved.