• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

窗体继承问题

waqiga 2004-11-06 04:11:52
子窗体继承了父窗体,为什么父窗体里面的控件声明为private ,子窗体里面还可以看到父窗体里面的控件啊,只是不能操作父窗体的控件。
怎么才能让子窗体中不显示父窗体里面的控件啊??
谢谢!
...全文
530 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
waqiga 2004-11-09
谢谢大家的建议。
不好意思,只有20分
下次一定多给大家一点啊。
回复
haonanernet 2004-11-07
1.了解什么是多态性

2.如何定义一个虚方法

3.如何重载一个虚方法

4.如何在程序中运用多态性

面向对象程序设计中的另外一个重要概念是多态性。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。 可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果它们都继承自某个类,你可以把这些派生类,都放到一个数组中。 如果这些对象都有同名方法,就可以调用每个对象的同名方法。本节课将向你介绍如何完成这些事情。

 

1.清单9-1. 带有虚方法的基类:DrawingObject.cs


 

using System;
public class DrawingObject
{
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
}


 

说明


清单9-1 定义了DrawingObject类。这是个可以让其他对象继承的基类。该类有一个名为Draw()的方法。Draw()方法带有一个virtual修饰符,该修饰符表明:该基类的派生类可以重载该方法。DrawingObject类的 Draw()方法完成如下事情:输出语句"I'm just a generic drawing object."到控制台。

 

2.清单9-2. 带有重载方法的派生类:Line.cs, Circle.cs, and Square.cs


 

using System;
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}

public class Circle : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Circle.");
}
}

public class Square : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Square.");
}
}


 

说明


清单9-2定义了三个类。这三个类都派生自DrawingObject类。每个类都有一个同名Draw()方法,这些Draw()方法中的每一个都有一个重载修饰符。重载修饰符可让该方法在运行时重载其基类的虚方法,实现这个功能的条件是:通过基类类型的指针变量来引用该类。

 

3.清单9-3. 实现多态性的程序:DrawDemo.cs


 

using System;
public class DrawDemo
{
public static int Main(string[] args)
{
DrawingObject[] dObj = new DrawingObject[4];
dObj[0] = new Line();
dObj[1] = new Circle();
dObj[2] = new Square();
dObj[3] = new DrawingObject();
foreach (DrawingObject drawObj in dObj)
{
drawObj.Draw();
}
return 0;
}
}


 

说明


清单9-3演示了多态性的实现,该程序使用了在清单 9-1 和清单9-2中定义的类。在DrawDemo类中的Main()方法中,创建了一个数组, 数组元素是DrawingObject 类的对象。该数组名为dObj,是由四个DrawingObject类型的对象组成。

接下来, 初始化dObj数组, 由于Line, Circle和Square类都是DrawingObject类的派生类,所以这些类可以作为dObj数组元素的类型。 如果C#没有这种功能,你得为每个类创建一个数组。继承的性质可以让派生对象当作基类成员一样用,这样就节省了编程工作量。

一旦数组初始化之后,接着是执行foreach循环,寻找数组中的每个元素。在每次循环中, dObj 数组的每个元素(对象)调用其Draw()方法。多态性体现在:在运行时,各自调用每个对象的Draw()方法。尽管dObj 数组中的引用对象类型是DrawingObject,这并不影响派生类重载DrawingObject 类的虚方法Draw()。 在dObj 数组中,通过指向DrawingObject 基类的指针来调用派生类中的重载的Draw()方法。

输出结果是:

 

I'm a Line.
I'm a Circle.
I'm a Square.
I'm just a generic drawing object.


在DrawDemo 程序中,调用了每个派生类的重载的Draw()方法。 最后一行中,执行的是DrawingObject类的虚方法Draw()。这是因为运行到最后,数组的第四个元素是DrawingObject类的对象。

回复
haonanernet 2004-11-07
基类也就是父窗体 的某些不需继承的方法 采用 virtual
派生类也就是子窗体 的改变的方法 采用 override
回复
haonanernet 2004-11-07
采用多态
回复
HuaEr2001 2004-11-07
回去好好看看C#的入门基础! 关于继承的
回复
zhongwanli 2004-11-07
既然用了继承,那就是全部继承

如果想 "让子窗体中不显示父窗体里面的控件啊"

将该控件的Modifed 属性改为 public

然后在子窗体里面设置 控件名.visible = false;

就OK
回复
TO:haonanernet(好男儿)
楼主指的是按纽怎么在子类里不可见啊,楼上的可以吗?
不是指的一个虚的方法或属性,而是按纽在界面的可见性.
回复
有方法让从父窗体传过来了控件在设计阶段就不显示或者设置它的位置吗?
-------------------------
你可以用类似下面的代码试试看:

protected override void OnLoad(EventArgs e)
{
if (DesignMode)
{
this.button1.Visible = false;
}
else
{
this.button1.Visible = true;
}
base.OnLoad (e);
}
回复
waqiga 2004-11-06

我知道的
只是觉得父亲窗体的控件在子窗体上面不好看,特别是在设计阶段,好象隐藏不了啊,在运行阶段肯定是没问题的。在设计阶段,父窗体的控件在子窗体上占着位子,我又不能把它拖到一边去,把整个设计表单的一些控件都挡住了。
有方法让从父窗体传过来了控件在设计阶段就不显示或者设置它的位置吗?
谢谢!
呵呵
回复
不过有这样一个情况,你想一下就是在C++里一个一般的类如果继承了一个父类,那么如果这个父类你可以"看到"的话,你想一下在它里面不也是存在着一些你不想看到的方法或属性吗?,只不过窗体这个类有一个可视的效果,你可以看到它的样子.实际上这个正是类的继承的正常现像,如果你真的不想在你的子类里"看"到某一个属性,就说这个按纽吧,你可以你可以在你的父类里写一个方法比如电HideButton(),在你的子类里调用 这个方法来隐藏按纽就是了.实现这也只是在外观看来有一个按纽,但是它不是一个在子类可以访问的属性按纽.所以不影响到面向对象的原则,因此你可以在你的父类里任意的来修改你的窗体的显示属性.
回复
waqiga 2004-11-06
呵呵
你是哪里的啊?
有QQ吗?
有时间多交流啊
我的QQ:34847249
回复
我明白你的意思:)
回复
waqiga 2004-11-06
父窗体是我自己写的啊,和子窗体在同一个Dll,子窗体继承了 父窗体,父窗体中声明为private的控件在窗体对应的cs代码文件里面是没继承的,但是在子窗体的可视化的表单上面还可以看到父窗体中声明为private的控件。
明白我的意思吗?:)
去掉 this.Controls.Add(控件)这种方法也不行啊,cs代码文件里面根本没父窗体的控件名啊。
回复
如果父类是你自己写的倒是可以有很多的控制,比如你可以控制是不是显示出来它,但是发果这个父类是已编译好的DLL你就没有办法了,职除非你向窗体发消息来隐藏.

你也可在你的父类里写方法来隐藏你的控件啊.
回复
waqiga 2004-11-06
是啊。我声明的父窗体上面的控件都是private的啊。子窗体里面不能操作父窗体的控件,但还能看的见。要是父窗体上面的控件都是public的,我还来这里问这么简单的问题啊。
你好象还没明白我的意思啊
回复人: qqamoon(口水龙)说的有差不多。但是我不明白里面的原因。
form也是一个类,控件就相当于是成员变量。为什么私有父窗体上的控件,在子窗体上还会显示,但是不能做任何操作。
谢谢了
回复
类可以选择继承还是不继承?
-----这句话不对啊,对于public的都是会让子类不可以少的,但是私有的或内部使用的当然不会传给字类.

难道父窗体的所有属性子窗体都要继承啊?
----只有内部的或私有的是不会传到子类的.公开的方法或属性都会传给子类的.
回复
waqiga 2004-11-06
啊?难道父窗体的所有属性子窗体都要继承啊?能不不能只继承一部分啊?
就象类的继承一样啊。窗体不也是类吗?
类可以选择继承还是不继承,窗体为什么不行啊?
谢谢!!
回复
龍过鸡年 2004-11-06
父窗口的控件 Visibled = false;
或者去掉 this.Controls.Add(控件); 这句话
回复
你的想法是不对的,子窗体当然要有父窗体的所有属性了:)这就像一个孩子像他的父亲一样了.
你要是不想让它有父类的特性那就不要用继承了,正是继承有这个特性才使得面像对象有很多的应用.
回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2004-11-06 04:11
社区公告

让您成为最强悍的C#开发者