所以我遇到了一个问题,我创建了一个类的对象,该类也有一个派生类,我需要从这些类访问这些属性。实际上,我已经有两个解决此问题的方法,我将在后面介绍。我不确定这是一个有效的问题还是只是代码审查,因为我已经有解决此特定问题的方法。我想我正在寻找更好的解决方案。好吧,让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是我要寻找的东西,但是我不确定,因为我从未使用过该类。就像我说的那样,我可能(而且很可能是)要求不可能的事情。
答案 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);
}
}
如果您没有在主函数中创建子对象,它将变得很复杂;)