传递了获取子类值的引用

本文关键字:引用 子类 获取 | 更新日期: 2023-09-27 18:24:11

考虑一下我为自己的教育编写的以下代码。我有一个主方法,一个静态方法和两个类-hold和subhold。子持有扩展持有。

 class Program
{
    static void Main(string[] args)
    {
        hold h = new hold();
        h.aa = 88;
        Console.WriteLine("In main " + h.aa);
        thismethod(h);
        Console.WriteLine("In main2 " + h.aa);
        Console.WriteLine("In main3 " + h.ss);  //ERROR
        Console.ReadKey();
    }
   static void thismethod (hold h) {
       Console.WriteLine("In thismdethod " + h.aa);
       h.aa += 1;
       Console.WriteLine("In thismdethod1 " + h.aa);
       h = null;
       subhold subhold = new subhold();
       subhold.aa = 8888;
       subhold.ss = 22222;
       h = subhold;
    }

}
class hold
{
    public int aa { get; set; }
}
class subhold : hold
{
    public int ss { get; set; }
}

我正在尝试访问h.ss。现在我无法访问它。如何从主方法访问h.ss

传递了获取子类值的引用

基类对派生类一无所知(更重要的是不应该知道)
属性。不同的派生类可以有一组不同的添加属性。让基类意识到这一点会抵消对象的重要原则定向设计

    static void Main(string[] args)
    {
        subhold h = new subhold();
        h.aa = 88;
        Console.WriteLine("In main " + h.aa);
        thismethod(h);
        Console.WriteLine("In main2 " + h.aa);
        Console.WriteLine("In main3 " + h.ss);  //no ERROR
        Console.ReadKey();
    }

如果通过引用传递h,则thismethod将更改Main的h以指向subhold的实例。

不过,Main中的变量h仍然被声明为hold。因此,您需要将其强制转换为subhold才能访问ss

static void Main(string[] args)
{
    hold h = new hold();
    h.aa = 88;
    Console.WriteLine("In main " + h.aa);
    thismethod(ref h);
    Console.WriteLine("In main2 " + h.aa);
    Console.WriteLine("In main3 " + ((subhold)h).ss);   // casted, no error.
    Console.ReadKey();
}
static void thismethod (ref hold h) {                   // passing by reference
   Console.WriteLine("In thismdethod " + h.aa);
   h.aa += 1;
   Console.WriteLine("In thismdethod1 " + h.aa);
   h = null;
   subhold subhold = new subhold();
   subhold.aa = 8888;
   subhold.ss = 22222;
   h = subhold;
}