OOP:如何定制契约,可以规定子类必须实现某些static的方法?

风中飘扬的柳絮 2005-01-05 10:33:05
比如说有一个父类:Employee ,有一个子类:Manager

我想找一种途径, 保证Manager代码中必须存在 public static Employee GetInstance()这样
的方法。

请大家帮忙指点,谢谢!
...全文
286 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
思归大虾的方法, 是一种实现的方法。但是我的问题有些不同,举例如下:

1. 我发布了一个MyFramework.dll, 其中有一个基类Equipment, 提供给客户端的编程人员使用,

public abstract class Equipment
{
String id;
//...
public abstract bool isAvailable();
public abstract void Recieve();
}

另外,有一个business logic的class,
public class RecieveManager
{
public void processRecieve(Equipment equipment)
{
if(equipment.isAvailable())
equipment.Recieve();
}
}


2.现在有一个程序员,要增加对PC的管理,所以,它只需要继承Equipment这个基类,并覆写所定义
的抽象方法就可以了

public class PC : Equipment
{
public bool isAvailable()
{
//put available checking code here...
return true;
}

public void Recieve()
{
//put recieving code here...
}
}

3. 客户端程序员,调用这个RecieveManager:

//这个地方是关键,我想确保每个继承于Equipment的类别,都包含getInstance()方法,
//或是说我还需要强制子类实现其他一些static的方法.
Equipment equipment = PC.getInstance();

RecieveManager rm = new RecieveManager();
rm.processRecieve(equipment);

现在问题是,我想要代码只要继承了Equipment,必须在子类中存在某些静态方法!

请问这样如何实现,或是我的思路有什么问题?谢谢!
crazyuu 2005-01-14
  • 打赏
  • 举报
回复
帮顶
ag1978 2005-01-14
  • 打赏
  • 举报
回复
我认为还是思归的方法好。
Ivony 2005-01-14
  • 打赏
  • 举报
回复
静态的方法不能被继承,你让子类必须实现有什么意义?换言之,基类的静态方法与它的派生类没有什么关系!况且,在程序中你怎么去知道某个类是另一个类的派生类,除非用反射,既然你用反射,直接反射出这个静态方法看看有没有不就行了?

子类中存在任何静态方法都与它的实例对象没有关系!

我现在拿到了某个类的实例,然后我知道它的派生类会实现某个静态方法,这有什么好处?你无法通过类的任何一个实例执行或者找到类的静态方法,除非用反射,又回到刚才的话题,既然用反射,又何必要什么契约?
  • 打赏
  • 举报
回复
nod...

自己陷入追求代码形式的陷阱了,检讨ing...好,结贴了,谢谢各位了.
HanYZ 2005-01-14
  • 打赏
  • 举报
回复
或许,你只需给Equipment一个静态方法,CreateInstance(System.Type type)或者CreateInstance(string type)
方法中检查type是否是Equipment的子孙类,然后用反射创建该类实例
HanYZ 2005-01-14
  • 打赏
  • 举报
回复
我想只要不是构造类实例的静态方法,其实都可以是非静态的,从而都可以定义为基类的抽象方法
你为何一定要用抽象方法呢?
即便是为访问具体子类的静态字段,也可以用非静态的抽象方法进行啊
  • 打赏
  • 举报
回复
是的,同意你的观点,也许是我的例子举得不大好,如果是其他用途的static method呢?

考虑另外一种解决的途径,就是用Factory模式来解决:

Equipment equipment = EquipmentFactory.CreateEquipment(EquipmentList.PC);

具体的Factory的配置放到一个xml文件里面:
<EquipmentFactory>
<Equipment name="NoteBook" type="MyFramework.Entity.NoteBook, MyFrameowrk.dll" />
<Equipment name="PC" type="MyFramework.Entity.PC, MyFrameowrk.dll" />
</EquipmentFactory>

HanYZ 2005-01-14
  • 打赏
  • 举报
回复
好像仅仅是一种执偏主导了你的感觉
为何不用
Equipment equipment = new PC();
取代
Equipment equipment = PC.getInstance();

对于你的应用来说,前者有什么不满足要求?
wendy188 2005-01-11
  • 打赏
  • 举报
回复
这种情况为什么一定要用在每个类都要实现相同的方法呢
面向对象的一条原则是"no repeate yourself"
  • 打赏
  • 举报
回复
呵呵...这个问题问的好, 因为这些object都是要作为一些framework的形势, 以dll提供给其他开发用的,为了使framework能够运行起来,是必须要规定从framework继承下来的object必须具体某些属性或是行为的.
  • 打赏
  • 举报
回复
楼上的大虾...

在C#中,interface中不能有static method的定义.
brbrm 2005-01-06
  • 打赏
  • 举报
回复
写一个接口,interface IEmployer {static Employer GetInstance();}
让Employer及其派生类都继承这个接口:
public class Employee : IEmployer
{
protected Employee() {}
public static Employee GetInstance() {}
....
}
  • 打赏
  • 举报
回复
所以,也就不能说强制让子类去实现某个静态方法了???
lawyu 2005-01-05
  • 打赏
  • 举报
回复
static是属于类的,c++或java中的模板方法模式应该可以实现,c#中应该也可以,不过没试过
Technologytomorrow 2005-01-05
  • 打赏
  • 举报
回复
静态函数属于类,而不属于任何一个类的实例!!!
mycjing 2005-01-05
  • 打赏
  • 举报
回复
在c++中可以使用模板。如果c#支持模板的话就可以用模板实现。
mycjing 2005-01-05
  • 打赏
  • 举报
回复
你的想法不对,静态函数和类是帮定的。不可能虚拟。
Manager.GetInstance()只能调用Manager的GetInstance方法。不可能调用他自类的。否则你如何确定调用那个自类?Manager不可能有自类的信息
  • 打赏
  • 举报
回复
还是说我的想法有问题,违背了OO的原则...这个是想实现如下的代码,无论是Manager还是其他任何子类的object, 我都可以用:

Employee employee = Manager.GetInstance();
或是
Employee employee = xxx.GetInstance();
  • 打赏
  • 举报
回复
谢谢,这个我了解。 再具体一些说吧,我有一个Component,以dll形式发布,里面如果有一个Employee的Class, 我希望只要是有人继承了Employee,就必须覆写public static Employee GetInstance()这样的一个method.

如果这个方法不是static的,很容易就可以用abstract去实现,可现在是static的方法,我要保证
每个继承的子类都要覆写,用abstract class和interface好像都没有找到方法。
加载更多回复(4)

110,536

社区成员

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

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

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