基类
class TestBase
{
protected int a;
protected int b;
public TestBase(int i)
{
a = i;
}
protected TestBase()
{
}
public void Update(int i)
{
a = i;
TestChild child = new TestChild();
child.Update("Hello World ");
}
儿童班
class TestChild:TestBase
{
private string msg;
public void Update (string s)
{
msg = s+ a.ToString();
Console.WriteLine("msg=" + msg);
}
}
调用
private void btnTest_Click(object sender, EventArgs e)
{
TestBase t = new TestBase(1);
t.Update(100);
}
结果 Hello World 0
问题 我希望得到Hello World 100.显然,子类没有访问基类变量int a。我怎么能这样做?
答案 0 :(得分:1)
您在TestBtn_Click
中创建的对象与您在TestBase.Update
中创建的对象无关。它们是两个不同的对象,因此每个对象都有自己的a
字段,其值不同。
要生成您期望的输出,您需要在child.a
中将this.a
设置为Update
:
public void Update(int i)
{
a = i;
TestChild child = new TestChild();
child.a = this.a;
child.Update("Hello World ");
}
这里要理解的重要一点是继承不会影响对象。继承只影响类。基类成员也将出现在子类中。就是这样。 即使objA
的类型继承自objB
,它们也是不相关的,除非它们是同一个对象。
答案 1 :(得分:0)
TestBase中的 child 对象不知道他放在哪里。它不知道它属于一个类。
当您创建子时,您还会创建一个完全不同的TestBase对象,该对象与包含子的对象不同。当您创建该对象时,将被初始化为默认值,在这种情况下为0。
如果您想将a的值传递给其他对象,您应该将其赋予它。例如,通过构造函数。
这样打电话:
TestChild child = new TestChild(a);
制作一个这样的构造函数:
public TestChild(int x) : base(x){}
不幸的是,你的概念从各处流失,所以它不会以这种形式发挥作用。我建议更多地研究inheritance。
答案 2 :(得分:0)
首先,目前还不清楚你想要完成什么。
此代码存在许多问题。首先,您不应该在TestBase类方法中创建TestChild的实例。如果你在btnTest_Click中创建一个TestBase实例,那么你将无法访问任何TestChild的方法或数据(除了你在TestBase中创建一个TestChild实例,这是不好的做法)。
继承的目的通常是扩展基类的数据/方法,而不是在基类中使用继承的类。此外,使用一组继承的类,您可以实现多态,这是面向对象编程的另一个核心原则。您应该更好地理解这些原则,然后代码将开始变得更有意义。
答案 3 :(得分:0)
你应该这样调用你的基类
class BaseClass
{
int a;
int b;
protected BaseClass()
{ }
protected BaseClass(int i)
{
a = i;
}
protected void Update(int i)
{
a = i;
Console.Write("Hello World ");
}
}
class TestChild : BaseClass
{
public TestChild(int i) : base(i) //send your constuctor to your base class
{ }
public TestChild()
{ }
public void Update(int i)
{
base.Update(i);
Console.Write(i.ToString());
}
}
private void btnTest_Click(object sender, EventArgs e)
{
TestChild t = new TestChild(); // create instance as your child
t.Update(100);
}
将您的对象创建为您的子类,然后调用您的方法并让它调用您的基类
如果想要从孩子那里访问基类中的a或b
public int a;
public
它可以让你从你创建的实例中访问它
protected
只允许子类内部访问
答案 4 :(得分:0)
public void Update(int i)
{
a = i;
TestChild child = new TestChild();
child.Update("Hello World ");
}
这是您为变量a赋值的地方,稍后您实例化了另一个不同的TestChild类实例。 在此实例化之后,您必须分配像
这样的值 TestChild child = new TestChild();
child.a = i;
child.Update("Hello World ");
然后你将得到你想要的结果
答案 5 :(得分:0)
这是如何使用继承:
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog("Dalmata", "Fuffy", 7);
}
}
class Animal
{
public string Name { get; set; }
public int Age { get; set; }
public Animal(string name, int age)
{
Name = name;
Age = age;
}
}
class Dog : Animal
{
public string Race { get; set; }
public Dog(string race, string name, int age) : base(name, age)
{
Race = race;
}
}
这样,即使它们在Animal中声明,你也可以访问Name和Age。
答案 6 :(得分:0)
如果您想获得预期结果,请在static
和/或a
变量的前面添加b
修饰符,如下所示:
static protected int a;
static protected int b;
在此之后,如果按下该按钮,它将写出:
msg=Hello World 100