C#子类变量怎样继承父类成员变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#子类变量怎样继承父类成员变量相关的知识,希望对你有一定的参考价值。

class Class1

public int a, b;


class Class2:Class1


public int ji()

return a * b;



*********************************************************************(a,b的值是从文本框输进去的 不管输几最后结果都是00)
private void button1_Click(object sender, EventArgs e)

Class1 a1 = new Class1();
Class2 a2 = new Class2();
a1.a = int.Parse(textBox1.Text);
a1.b = int.Parse(textBox2.Text);
textBox3.Text = a2.a.ToString() + a2.b.ToString();

这本来是求乘积的程序但结果老是0 于是求大神只要做到在文本框3里显示a,b(从文本框1,2输的值不是0了就行 其实就是简单继承变量问题 我一定是哪出错了 请指教

private void button1_Click(object sender, EventArgs e)
        
            Class1 a1 = new Class1();
            Class2 a2 = new Class2();
            a1.a = int.Parse(textBox1.Text);
            a1.b = int.Parse(textBox2.Text);
            textBox3.Text = a2.a.ToString() + a2.b.ToString();
        
        
你给a1的字段赋值,a2的字段 a2.a, a2.b 还是默认初始化啊,也就是0,所以结果是00毫不奇怪。
private void button1_Click(object sender, EventArgs e)
        
            
            Class2 a2 = new Class2();
            a2.a = int.Parse(textBox1.Text);
            a2.b = int.Parse(textBox2.Text);
            textBox3.Text = a2.a.ToString() + a2.b.ToString();
        
这样你试试看

追问

这样可以 但是我想让a2.a a2.b这两个变量继承父类的变量 也就是说他们的值是和a1.a a1.b 是一样的 父类变量是什么 子类变量就是什么

追答

建议你看一下类与对象之间的关系。
Class2 a2,b2,c2;
a2.a = 5;
a2.b = 10;

这儿定义了三个Class2的对象,然后给a2的a,b分别赋值5,10,你觉得b2,c2的a,b属性值是几?
如果你想让两个对象一致,那你就用引用啊。
Class2 c1;
Class2 c2 = &c1;
这样,c2就是c1的引用了,你对c1做的任何改变,从c2来看,也是一样的。
你说的这种不是继承,建议看看面向对象方面的知识,了解下继承,类,对象的相关概念。

参考技术A  C#中的父类与子类的继承关系与C和C++中的类似,这里先阐述最重要的一点:假如子类继承了父类,那么子类可以强制转换为父类,并且保证编译和运行都不出错;但是父类强制转换成子类的时候,编译可以通过运行通不过。请看如下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FatherAndSon

class ClassA

static void Main(string[] args)

//编译和运行都能通过
ClassB b = new ClassB();
ClassA a = (ClassA)b;

//编译能通过,运行通不过
ClassA aa = new ClassA();
ClassB bb = (ClassB)aa;




class ClassB : ClassA





  实际上:将子类强制转换为父类之后,在用这个父类强制转换为另外一个子类的时候编译和运行也都能通过;只是如果将父类直接转换为子类的时候运行会出错。这就好比:假设父类是一个装了5个“苹果”的“小型篮子”,而子类则是一个装了5个“苹果”和5个”西瓜“的大型篮子;将子类强制转换为父类<=>把父类的”小型篮子“换成”大型篮子“,但还是只装5个”苹果“(将父类的引用指向子类,但父类只能调用父子自身的变量和方法),之后再用这个父类强制转换为另外一个子类<=>向”大型篮子“里面装入5个”西瓜“送给子类的引用;而将父类直接转换为子类<=>用父类的”小型篮子“装”5个苹果和5个西瓜“送给子类的引用(当然是装不下)请看如下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FatherAndSon

class ClassC

static void Main(string[] args)

//先将子类强制转换为父类,然后用此父类强制转换为另外一个子类(通过)
ClassB b = new ClassB();
ClassA a = (ClassA)b;
ClassB bbbbb = (ClassB)a;

//(将父类直接强制转换为子类)编译能通过,运行通不过
ClassA aa = new ClassA();
ClassB bb = (ClassB)aa;




class ClassA



class ClassB : ClassA





  另外一个值得非常注意的地方是:无论是子类强制转换赋给父类,还是父类(由子类强转得到)强制转换为子类;类对象是根据声明的类型(子类或父类)去调用其变量和函数的,与赋值无关。请看如下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FatherAndSon

class ClassC

static void Main(string[] args)

//先将子类强制转换为父类,然后用此父类强制转换为另外子类(通过)
ClassB b = new ClassB();
b.PrintFunc();
Console.WriteLine(b.myStr);

ClassA a = (ClassA)b;
a.PrintFunc();
Console.WriteLine(a.myStr);

ClassB bbbbb = (ClassB)a;
bbbbb.PrintFunc();
Console.WriteLine(bbbbb.myStr);

//(将父类直接强制转换为子类)编译能通过,运行通不过
//ClassA aa = new ClassA();
//ClassB bb = (ClassB)aa;
//bb.PrintFunc();




class ClassA

public string myStr;
public ClassA()

myStr = "Hello, This is myStr in ClassA";


public void PrintFunc()

Console.WriteLine("This is the Print Function in ClassA");



class ClassB : ClassA

public string myStr;
public ClassB()

myStr = "Hello, This is myStr in ClassB";

public void PrintFunc()

Console.WriteLine("This is the Print Function in ClassB");



  上面代码输出的结果为:
    This is the Print Function in ClassB
    Hello, This is myStr in ClassB
    This is the Print Function in ClassA
    Hello, This is myStr in ClassA
    This is the Print Function in ClassB
    Hello, This is myStr in ClassB
  可以看出:类的实例对象在调用其变量和方法时,确实是以 声明 成为的类为依据的。

22.2 继承的 成员变量的执行顺序

/*
* 继承中成员变量的特点:
* 子类只能继承父类的非私有成员
* 子父类中成员变量名字是一样的获取的是子类的成员变量
*
*
* 就近原则:
* 优先级(由近到远)为:局部变量---子类成员变量---父类成员变量
*
*super:子类对象的父类引用。(可以获取父类成员的变量和方法,用法同this)
* 调用父类的成员方法和变量
*this:当前对象的引用。
* 调用子类的成员方法和变量
* */

public class 继承成员变量执行优先级 
    public static void main(String[] args) 
        Kid k = new Kid();
        k.show();
    


class Dad 
//    private String name = "dads";
    String name = "your dad";


class Kid extends Dad 
    String name = "your kid";

    public void show() 
        String name = "your name";
        System.out.println(name);
        System.out.println(this.name);
        System.out.println(super.name);
    

输出

技术图片

 

以上是关于C#子类变量怎样继承父类成员变量的主要内容,如果未能解决你的问题,请参考以下文章

父类的成员变量赋了值,子类继承该变量,值还是父类的值吗?

继承的基本概念: Java不支持多继承,也就是说子类至多只能有一个父类。 子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 子类中定义的成员变量和父类中

子类能不能继承父类的成员变量

22.2 继承的 成员变量的执行顺序

java 父类static变量 子类能集成吗

Java基础 成员变量的继承与覆盖