有关类的一些问题

zjy1985cool 2008-10-22 10:18:59
protected void Page_Load(object sender, EventArgs e)
{
B b = new B();
b.show();
b.show0();
Response.Write(b.show() + b.show0());
ook o = new ook();
Response.Write("...."+o.oo() + o.o());
}
abstract class A
{
public string show0()
{
return "a";
}
abstract public string show();
}
class B : A
{
public override string show()
{
return "b";
}
}
class ok
{
public string o()
{
return "ab";
}
}
class ook:ok
{
public string oo()
{
// return "aba";
return o();
}
}
问题:抽象类可以有抽象方法,但是普通类直接具体了不是更直接,为什么要用抽象类呢?它有什么好处?
...全文
67 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjy1985cool 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wanghui0380 的回复:]
我们从两个方面说吧:
1.从对象编写者说,我需要和这个很类似,但是具体又不同的一个对象。你会怎么办。这个答案很明显,我需要继承并改写
2.从调用者来说:如果你继承而且改写了,你是简单了,偷懒了!我呢??你变了,我不是也要跟着变??

那么基于上面两个方面:对象编写者改如何处理呢?

对象编写者就说:好吧我既要能继承能改写,我也要保证你的代码调用方式无太大变化。ok,我抽象一个基类出来
A a=new B()…
[/Quote]

说的不错
zjy1985cool 2008-10-22
  • 打赏
  • 举报
回复
public override string chashu(string name, string sex,string age) //出错行
zjy1985cool 2008-10-22
  • 打赏
  • 举报
回复
class geshu
{
public virtual string chashu(string name, string sex)
{
if (name != null && sex != null)
{
return "姓名:" + name + "性别:" + sex;
}
else
{
return null;
}
}
}
class okgeshu:geshu
{
public override string chashu(string name, string sex,string age)
{
if (name != null && sex != null && age != null)
{
return "姓名:" + name + "性别:" + sex + "年龄" + age;
}
else
{
return null;
}
}
}
我想重写这个但下面出错了怎么改恩?
wanghui0380 2008-10-22
  • 打赏
  • 举报
回复
我们从两个方面说吧:
1.从对象编写者说,我需要和这个很类似,但是具体又不同的一个对象。你会怎么办。这个答案很明显,我需要继承并改写
2.从调用者来说:如果你继承而且改写了,你是简单了,偷懒了!我呢??你变了,我不是也要跟着变??

那么基于上面两个方面:对象编写者改如何处理呢?

对象编写者就说:好吧我既要能继承能改写,我也要保证你的代码调用方式无太大变化。ok,我抽象一个基类出来
A a=new B()这个总是可以的把,所有子类都可以转的父类上滴。你调用的时候都转换到父类,直接用父类调用就好了。
周公 2008-10-22
  • 打赏
  • 举报
回复
把new、virtual、override说透
本文探讨了new、virtual和override机制,并从相对较底层的原理去解释了程序的运行结果。稍带对比了一下Java里面的运行机制。并且讲述了早绑定和晚绑定概念。这里要提到两个概念:早绑定(early binding)和晚绑定(Late binding)。这个术语出现在存在继承关系的基类和派生类中,它们同时定义了一个同名同参的方法。早绑定:在编译的时候就已经确定了将来程序运行基类或是派生类的哪个方法。在编译代码的时候根据引用类型就决定了运行该引用类型中定义的方法,即基类的方法。这种方法运行效率高。晚绑定:只有在运行的时候才能决定运行基类或者派生类中的哪个方法。运行的时候将根据该实际类型而不是引用类型来调用相关方法,即取决于我们new了什么样对象。也就是即使我们new一个Father类的子类Son的实例,而不管我们是用Father类的引用指向这个Son的实例,方法调用的时候依然是调用Son的方法,而不是Father类的同名方法。
http://blog.csdn.net/zhoufoxcn/archive/2008/09/02/2864429.aspx
看看这个你就能明白一些了。
zjy1985cool 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 MicrosoftCenterOfHN 的回复:]
继承的时候有用,实现多态.
例:
动物类:里面有个抽象方法为 : 叫

那么猫,狗,猪等继承过来后.就要实现那个叫的方法.那么每个动物的叫声是不一样的.这就是多态.

试想,如果"叫"不是抽象的话.会是什么样子.
[/Quote]

抽象方法:只有方法的声明,没有方法的实现,例:public abstract void d();

抽象方法没有实例怎么发出叫啊?你哪个用虚方法到不错,用抽象类怎么实现呢??
zjy1985cool 2008-10-22
  • 打赏
  • 举报
回复
可以把你这个写个抽象类我看看吗?
  • 打赏
  • 举报
回复
继承的时候有用,实现多态.
例:
动物类:里面有个抽象方法为 : 叫

那么猫,狗,猪等继承过来后.就要实现那个叫的方法.那么每个动物的叫声是不一样的.这就是多态.

试想,如果"叫"不是抽象的话.会是什么样子.
zjy1985cool 2008-10-22
  • 打赏
  • 举报
回复
protected void Page_Load(object sender, EventArgs e)
{
B b = new B();
b.show();
b.show0();
Response.Write(b.show() + b.show0());
ook o = new ook();
Response.Write("...."+o.oo() + o.o());
Response.Write("</br>");
B1 bb = new B1();
A1 aa = bb;
aa.F();
bb.F();
aa.G();
bb.G();
Response.Write(aa.F()+bb.F()+aa.G()+bb.G());
}
abstract class A
{
public string show0()
{
return "a";
}
abstract public string show();
}
class B : A
{
public override string show()
{
return "b";
}
}
class ok
{
public string o()
{
return "ab";
}
}
class ook:ok
{
public string oo()
{
// return "aba";
return o();
}
}
class A1
{
public string F()
{
return "a1";
}
public virtual string G()
{
return "aa1";
}
}
class B1:A1
{
new public string F()
{
return "b1";
}
public override string G()
{
return "bb1";
}
}
虚方法到不错,方法功能不全可以多加几个.但是抽象类.....
zjy1985cool 2008-10-22
  • 打赏
  • 举报
回复
弄个例子啊...
cteddy 2008-10-22
  • 打赏
  • 举报
回复
多态的时候就有用了

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧