我想在C#中覆盖一个方法,但我有一个不同的签名

use*_*010 3 c#

基类用户应该访问原始方法

class A
 public init()
Run Code Online (Sandbox Code Playgroud)

派生类用户应仅使用派生方法.

class B
 public init(int info)
Run Code Online (Sandbox Code Playgroud)

我不能使用"覆盖"bc有一个不同的签名.我有什么选项,以便派生类用户看不到两个方法.

笔记.总而言之,我只需要两个共享一些代码的类.继承不是必须的.但是B的用户的简单性是优先考虑的.

jas*_*son 9

这是一个很大的代码气味(违反了一些基本的OOP原则),据我所知,不能用任何语言来完成.在OOP中,实例B是一个实例A; 这是多态性.因此,如果A有一个名为不init接受参数的公共方法,那么也是如此B.

你想要做什么?

编辑:现在您已经添加了指出继承不是必须的编辑,只需使用组合来共享代码.给出B的一个私有的实例A,例如.


Emi*_*nov 5

根据Liskov原则,你根本不能这样做,因为它违反了这个原则.您可以做的最好的事情是init()在派生类中重写并使其在每次调用时抛出异常,指出用户应该使用init(int info)并依赖测试来捕获错误.

为什么你不能简单地替换init()方法甚至使它受到保护?

Liskov原则陈述(改述)在需要实例的情况下class A,class B extends A可以传递一种意义.如果某个方法需要A并且想要调用init()它并且使用该方法传递给它B(哪个extends A)protected init()将失败.这就是代码甚至无法编译的原因.