传递了获取子类值的引用
本文关键字:引用 子类 获取 | 更新日期: 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;
}