关于继承~

carlbiao 2009-11-21 10:22:02
B类继承自A类
A a = new B();
那么a只能调用A类的公有成员,那这样的话A a = new B();还有什么意义?直接用A a = new A();不就行了吗?
...全文
337 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
Justin-Liu 2009-11-22
  • 打赏
  • 举报
回复
学习
MoFzAgel 2009-11-22
  • 打赏
  • 举报
回复
楼主写错老! 前提是A:B
forever_ai 2009-11-22
  • 打赏
  • 举报
回复
这是向上转型 从子类转向父类 反过来就是向下转型
如果父类是抽象类那就不能new 只能通过子类间接new
不过这时子类的方法和属性将会被父类覆盖掉
这是一种简单的多态
多态有四种:
1.强制多态
2.重载多态 (1和2又叫伪多态)
3.参数化多态
4.重写多态(3和4又叫曾多态)
kangde 2009-11-22
  • 打赏
  • 举报
回复
如果不详细说,

估计 '多态' 一词唤醒不起什么
烈火蜓蜻 2009-11-22
  • 打赏
  • 举报
回复
这样做的意义,就是为了实现,多态性,
jin20000 2009-11-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 koukoujiayi 的回复:]
也不能说一点意义都没有!!
楼主这样做,虽然不能访问到B类的公共方法,
但A a = new B(); 这样创建实例,
首先会执行到B类中得成员变量,也会执行到B类的构造函数(如果有的话),
也许有这种需要,只要执行某个类的成员变量和构造函数,
所以还是有意义的!!

[/Quote]
up
Invincible1 2009-11-22
  • 打赏
  • 举报
回复
第一种写法有多态的味道在里面,如果A里面的方法在B里面被override了,那么a.Method()将是B里面的方法。而非是A里面的方法
wartim 2009-11-22
  • 打赏
  • 举报
回复
还可以用于反射
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
A X;
X = CreateClass(typeof(A));
X = CreateClass(typeof(B));
Console.Read();
}

class A
{
public A()
{
Console.WriteLine("A");
}
}

class B : A
{
public B()
{
Console.WriteLine("B");
}
}

static A CreateClass(Type T)
{
if (T==typeof(B))
return new B();
else
return new A();
}
}
}
wartim 2009-11-22
  • 打赏
  • 举报
回复
和接口类似,可以起到一个通用形参的作用,还有其他的用处
你看C#里的参数不就是么
Object sender

sender可以是任何从Object继承的
wartim 2009-11-22
  • 打赏
  • 举报
回复
怎么能说没意义
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
A X;
X = new A();
Print(X);
X = new B();
Print(X);
Console.Read();
}

class A
{
public A()
{
Console.WriteLine("A");
}
}

class B:A
{
public B()
{
Console.WriteLine("B");
}
}

static void Print(A X)
{
if (X is B)
Console.WriteLine("Print B");
else
Console.WriteLine("Print A");
}
}
}
wangminqi 2009-11-22
  • 打赏
  • 举报
回复
这样做是可以 的,前提是有继承关系,这样做目的是,多个子类共同继承A,(这时A有点像抽象类《或者就是抽象类》或接口),多个子类有共同的属性和方法,方便使用(如类工厂的使用),如果需要使用b类特有的功能时,使用 as B 或强制转换 ,就可以使用b的方法属性了。

http://www.mybuffet.cn
carlbiao 2009-11-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 vrhero 的回复:]
确实没意义...但“直接用A a = new A();”是不行的,区别很大...

A a = new B(); 和 B b = new B(); 几乎是等效的...说几乎是因为他们还是有一点点区别的...因为前者a是声明为A类型,所以a的引用类型元数据只是类型A的元数据,但它的实例类型却是不折不扣的B类型,也就是说a对象实例实际上具有类型B的元数据...而b对象从引用类型到实例类型都是B类型,就b对象实例本身而言和前者没有区别...

而“直接用A a = new A();”,则a从引用类型到实例都是A类型,和B没有任何关系...

这样用的目的是教学,告诉你继承的一个特性——派生类可以隐式转换为基类...
C# codeA a=new B();//相当于
A a;
B b=new B();
a= b;
反过来...基类不可以转换为派生类,隐式显式都不行,所以“直接用A a = new A();”就是另一个概念了...

实际应用中这样的用法是没什么意义的...也许有人觉得有时这样用清楚一些,比如...
C# codeA a=new B();
func(a);void func(A a){}
但它其实和下面这段没有不同,一样清楚...
C# codeB b=new B();
func(b);void func(A a){}
[/Quote]
谢谢!非常详细!
  • 打赏
  • 举报
回复
呵呵,说明你还不明白面向对象编程

创建父类型子类 或者接口类型的类

就是多态的表现。你不必限制其具体类型,只实现了父类,或者接口。

blueink_200451 2009-11-22
  • 打赏
  • 举报
回复
路过。学习。
huqinglu123 2009-11-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 carlbiao 的回复:]
B类继承自A类
A a = new B();
那么a只能调用A类的公有成员,那这样的话A a = new B();还有什么意义?直接用A a = new A();不就行了吗?
[/Quote]
如果B中有A中重写的成员函数,还可以调用B中重写的函数。
这样做是为了实现多态性,只是你的太简单了,没显示出来罢了
Taiyangchen 2009-11-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 vrhero 的回复:]
确实没意义...但“直接用A a = new A();”是不行的,区别很大...

A a = new B(); 和 B b = new B(); 几乎是等效的...说几乎是因为他们还是有一点点区别的...因为前者a是声明为A类型,所以a的引用类型元数据只是类型A的元数据,但它的实例类型却是不折不扣的B类型,也就是说a对象实例实际上具有类型B的元数据...而b对象从引用类型到实例类型都是B类型,就b对象实例本身而言和前者没有区别...

而“直接用A a = new A();”,则a从引用类型到实例都是A类型,和B没有任何关系...

这样用的目的是教学,告诉你继承的一个特性——派生类可以隐式转换为基类...
C# codeA a=new B();//相当于
A a;
B b=new B();
a= b;
反过来...基类不可以转换为派生类,隐式显式都不行,所以“直接用A a = new A();”就是另一个概念了...

实际应用中这样的用法是没什么意义的...也许有人觉得有时这样用清楚一些,比如...
C# codeA a=new B();
func(a);void func(A a){}
但它其实和下面这段没有不同,一样清楚...
C# codeB b=new B();
func(b);void func(A a){}
[/Quote]

right
hxkk191516 2009-11-22
  • 打赏
  • 举报
回复
当一个类继承于另一个类,那么在实例化这个子类的时候,会在创建子类对象之前首先创建父类的对象实例。

cuike519 2009-11-22
  • 打赏
  • 举报
回复
类型!=类


vrhero 2009-11-22
  • 打赏
  • 举报
回复
确实没意义...但“直接用A a = new A();”是不行的,区别很大...

A a = new B(); 和 B b = new B(); 几乎是等效的...说几乎是因为他们还是有一点点区别的...因为前者a是声明为A类型,所以a的引用类型元数据只是类型A的元数据,但它的实例类型却是不折不扣的B类型,也就是说a对象实例实际上具有类型B的元数据...而b对象从引用类型到实例类型都是B类型,就b对象实例本身而言和前者没有区别...

而“直接用A a = new A();”,则a从引用类型到实例都是A类型,和B没有任何关系...

这样用的目的是教学,告诉你继承的一个特性——派生类可以隐式转换为基类...
A a = new B();

//相当于

A a;
B b = new B();
a = b;

反过来...基类不可以转换为派生类,隐式显式都不行,所以“直接用A a = new A();”就是另一个概念了...

实际应用中这样的用法是没什么意义的...也许有人觉得有时这样用清楚一些,比如...
A a = new B();
func(a);

void func(A a){}

但它其实和下面这段没有不同,一样清楚...
B b = new B();
func(b);

void func(A a){}
kangde 2009-11-22
  • 打赏
  • 举报
回复
virtual! virtual!
加载更多回复(7)

110,577

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

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