来自父母的孩子的呼叫方法(C#)

时间:2015-07-31 06:48:30

标签: c# inheritance methods

我认为我的疑问很容易解决,但我在谷歌上没有找到任何答案,所以,你可以帮助我:

有两个课程,如:

class A
{
    string _Prop1;
    string _Prop2;

    public string Prop1 
    {
        get { return _Prop1; }
        set { _Prop1 = value; }
    }

    public string Prop2 
    {
        get { return _Prop2; }
        set { _Prop2 = value; }
    }

    public A() 
    {
      // CALL METHOD FROM CHILD B, PASSING PARAMETER, LIKE:
      // B objB = new B();
      // b.LoadData()
      // So, at this point, A properties would receive the sent values from B          
      // (what i really want)
    }
}

class B : A
{
    public void LoadData() 
    {
       Prop1 = "Foo";
       Prop2 = "Bar";
    }
}

 A objA = new A();

 Console.Write("PROP1: {0} / PROP1: {1}", objA.Prop1, objA.Prop2);

 objA.Prop1 = "Hello";
 objA.Prop2 = "World";

 Console.Write("PROP1: {0} / PROP1: {1}", objA.Prop1, objA.Prop2);

 Console.ReadKey();

因此,在主程序中将显示:第一个" PROP1:Foo / PROP2:Bar"然后" PROP1:Hello / PROP2:World",但是,第一个Console.Write()显示为空(PROP1:/ PROP2 :) ...

希望你能帮助我。 非常感谢。

4 个答案:

答案 0 :(得分:1)

您可以通过使Class A抽象定义一个Class B必须覆盖的抽象方法来解决此问题。 E.g:

abstract class A {
   public string Prop1 { get; set; }
   public string Prop2 { get; set; }

   protected abstract void LoadData();

   public A() {
      //some code
      LoadData();
      //some code
   }
}

然后

class B : A {
    protected override void LoadData() {
        //Class B implementation of LoadData which can 
        //access Class A properties and init them, e.g.
        Prop1 = "foo";
        Prop2 = "bar";
    }
}

答案 1 :(得分:0)

使用方法隐藏类Mapper和B类中的new和virtual关键字,如下所示:

class Program
{
    static void Main(string[] args)
    {
        Mapper a = new B(); //notice this line
        B b = new B();

        a.doStuff();
        b.doStuff();

        Console.ReadLine();
    }
}

class A
{
    public void doStuff()
    {
        Console.WriteLine("A did stuff");
    }
}

class Mapper : A
{
    new public virtual void doStuff() //notice the new and virtual keywords here which will all to hide or override the base class implementation
    {
        Console.WriteLine("Mapper did stuff");
    }
}

class B : Mapper
{
    public override void doStuff()
    {
        Console.WriteLine("B did stuff");
    }
}

答案 2 :(得分:0)

您在A构造函数中的评论是错误的,您无法创建对象的 new 实例,并希望调用对象检索这些值。

当然,您可以在执行加载数据后将值分配给from b,但这仍然建立在创建对象的前提下,以便初始化一个有点错误的对象。

public A() 
{
    B b = new B();
    b.LoadData();
    this.Prop1 = b.Prop1;
    this.Prop2 = b.Prop2;
}

相反,在基类A中加载数据可能更有意义,因为它不会对B的实例执行任何特殊操作(来自您的'向我们展示了)

答案 3 :(得分:0)

这不是问题,因为两个类有不同的引用,你可以使用基类或使用下面的方法来解决你的问题。

A objA = new B();

((B)objA).LoadData();

Console.Write("PROP1: {0} / PROP1: {1}", objA.Prop1, objA.Prop2);