这种代码要怎么写?

lyd963 2009-07-15 12:17:03
我有3个类ABC,他们都继承自D,ABC有各自的扩展功能,所以接口不相同,现在想根据条件,生成对象,比如当x=“1”时 返回A;当X=“2”时,返回B;。。。返回的对象名称要相同,这个要怎么写?

...全文
21 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel6709 2009-07-15
  • 打赏
  • 举报
回复
简单工厂模式
lyd963 2009-07-15
  • 打赏
  • 举报
回复
if (d is A)
{
(d as A).Fa();
}


这个可以,哇哈哈~~~~~~
acqy:你真是太帅啦!!!!!
shadow_2006 2009-07-15
  • 打赏
  • 举报
回复
mark!
acqy 2009-07-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lyd963 的回复:]
引用 1 楼 acqy 的回复:
C# code
D d;switch (X)
{case1: d=new A();break;case2: d=new B();break;default: d=new C();break;
}return d;


这个方法我试过,在调用方法的时候会报**** d 未定义某个方法“****”。
[/Quote]

你调用的时候肯定是只能调到D里面所定义的方法啊,因为D是父类,只不过在A、B、C中可能会重写D中的方法,从而使得d在X取值不同的时候,会出现不同的行为,这也是所谓之多态的具体表现。
假设D里面只定义了Fd()这个方法,而A继承于D,同时A里面有Fa()这个方法,并且A重载了Fd()方法,那么上面的代码只能调用到A实例中的Fd()方法,你是没法调用到Fa()的。比如,假设X=1,那么:

D d;
switch (X)
{
case 1: d=new A(); break;
case 2: d=new B(); break;
default: d=new C(); break;
}
d.Fd(); // OK,此时将调用A中重载的Fd()方法
d.Fa(); // Error,因为D中没有定义Fa()方法


如果你要通过d调用Fa(),那么就只有:

if (d is A)
{
(d as A).Fa();
}


lyd963 2009-07-15
  • 打赏
  • 举报
回复
我也在看工厂模式,不过工厂模式适用的条件是接口要一致,而且我还想用同一个名称来使用返回的类,这个就不知道能不能实现了。
kkun_3yue3 2009-07-15
  • 打赏
  • 举报
回复
lihuinihao6315 2009-07-15
  • 打赏
  • 举报
回复
工厂方法模式,实例。
SEIWXP 2009-07-15
  • 打赏
  • 举报
回复
mark
lyd963 2009-07-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 acqy 的回复:]
C# code
D d;switch (X)
{case1: d=new A();break;case2: d=new B();break;default: d=new C();break;
}return d;
[/Quote]

这个方法我试过,在调用方法的时候会报**** d 未定义某个方法“****”。
acqy 2009-07-15
  • 打赏
  • 举报
回复

D d;
switch (X)
{
case 1: d=new A(); break;
case 2: d=new B(); break;
default: d=new C(); break;
}
return d;
wewei123shangdawei 2009-07-15
  • 打赏
  • 举报
回复
帮你顶一下
annwatasi 2009-07-15
  • 打赏
  • 举报
回复
mark
lyd963 2009-07-15
  • 打赏
  • 举报
回复
简单工厂模式:
看了网上很多写工厂模式的例子,给出的或者是接口完全的代码,比如:

public class person{ //基类
public person(){

}
}
public class man :person //继承类
{
public man(){
}
}
public class women:person{ //继承类

}
public class factory{ //工厂
private bool sex=true;
public bool Sex{
get{return sex;}
set{sex=value;}
}
public factory(){

}
public person getInstance(){
if(sex){
return new man();
}
else{
return new women();
}
}
}

public class Test(){ //调用
public Test(){
factory f=new factory();
f.sex= true;
person p=f.getInstance();

}
}

或者是返回实例化多个接口的代码,比如:
public interface IAVDevice
{
IAudio GetAudio();
IVideo GetVideo();
}

public interface IVideo
{
string GetPictureQuality();
}

public interface IAudio
{
string GetSoundQuality();
}

class CCd:IAVDevice
{
public IAudio GetAudio()
{
return new CCdAudio();
}
public IVideo GetVideo()
{
return new CCdVideo();
}
}

class CDvd:IAVDevice
{
public IAudio GetAudio()
{
return new CDvdAudio();
}
public IVideo GetVideo()
{
return new CDvdVideo();
}
}

class CCdAudio:IAudio
{
public string GetSoundQuality()
{
return "CD Audio is better then DVD Audio";
}
}

class CCdVideo:IVideo
{
public string GetPictureQuality()
{
return "CD video quality is not as good as DVD";
}
}

class CDvdAudio:IAudio
{
public string GetSoundQuality()
{
return "DVD Audio is not as good as CD Audio";
}
}

class CDvdVideo:IVideo
{
public string GetPictureQuality()
{
return "DVD video quality is better then CD";
}
}




class CAVMaker
{
public IAVDevice AVMake(string xWhat)
{
switch (xWhat.ToLower())
{
case "cd":
return new CCd();
case "dvd":
return new CDvd();
default:
return new CCd();
}
}

}



public class AbstractFactory
{
static void Main(string[] args)
{
CAVMaker objFactMaker = new CAVMaker();
IAVDevice objFact;
IAudio objAudio;
IVideo objVideo;
string strWhat;
strWhat = args[0];
objFact = objFactMaker.AVMake(strWhat);
objAudio = objFact.GetAudio();
objVideo = objFact.GetVideo();
Console.WriteLine(objAudio.GetSoundQuality());
Console.WriteLine(objVideo.GetPictureQuality());
}
}

不知道怎么实现接口有差异、且只返回有差异的类中的某一个类的情况?

110,525

社区成员

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

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

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