C#中的多重继承由于多重继承不好(使源变得更复杂),C#没有直接提供这样的模式。但有时候有这种能力会很有帮助。例如,我能够使用接口和三个类实现缺少的多继承模式:public interface IFirst { void FirstMethod(); }public interface ISecond { void SecondMethod(); }public class First:IFirst {
public void FirstMethod() { Console.WriteLine("First"); } }public class Second:ISecond {
public void SecondMethod() { Console.WriteLine("Second"); } }public class FirstAndSecond: IFirst, ISecond{
First first = new First();
Second second = new Second();
public void FirstMethod() { first.FirstMethod(); }
public void SecondMethod() { second.SecondMethod(); }}每次我向其中一个接口添加一个方法时,我都需要更改这个类。第一和第二也是。有没有一种方法可以像在C+中那样将多个现有的类注入到一个新的类中?也许有一种使用某种代码生成的解决方案?或者看起来像这样(虚构的c#语法):public class FirstAndSecond: IFirst from First, ISecond from Second{ }这样,当我修改其中一个接口时,就不需要更新类FirstAndSecond了。编辑也许最好考虑一个实际的例子:您有一个现有的类(例如,基于ITextTcpClient的基于文本的TCP客户机),您已经在项目中的不同位置使用了这个类。现在,您感到需要创建类的组件,以便于Windows窗体开发人员访问。据我所知,您目前有两种方法可以做到这一点:编写从组件继承的新类,并使用类本身的实例实现TextTcpClient类的接口,如FirstAndSecond所示。编写一个从TextTcpClient继承并以某种方式实现IComponent的新类(实际上还没有尝试过这一点)。在这两种情况下,您都需要在每个方法而不是每个类进行工作。因为您知道我们需要TextTcpClient和Component的所有方法,所以将这两个方法组合成一个类将是最简单的解决方案。为了避免冲突,这可以通过代码生成来完成,在代码生成之后可以更改结果,但是手工输入这是一个纯粹的痛苦。
3 回答
慕沐林林
TA贡献2016条经验 获得超9个赞
由于多重继承不好(使源变得更复杂),C#没有直接提供这样的模式。但有时候有这种能力会很有帮助。
宝慕林4294392
TA贡献2021条经验 获得超8个赞
ISteerable
SteeringWheel
, IBrakable
BrakePedal
public interface ISteerable { SteeringWheel wheel { get; set; } }public interface IBrakable { BrakePedal brake { get; set; } } public class Vehicle : ISteerable, IBrakable{ public SteeringWheel wheel { get; set; } public BrakePedal brake { get; set; } public Vehicle() { wheel = new SteeringWheel(); brake = new BrakePedal(); }}public static class SteeringExtensions{ public static void SteerLeft(this ISteerable vehicle) { vehicle.wheel.SteerLeft(); }}public static class BrakeExtensions{ public static void Stop(this IBrakable vehicle) { vehicle.brake.ApplyUntilStop(); }}public class Main{ Vehicle myCar = new Vehicle(); public void main() { myCar.SteerLeft(); myCar.Stop(); }}
HUH函数
TA贡献1836条经验 获得超4个赞
- 3 回答
- 0 关注
- 805 浏览
添加回答
举报
0/150
提交
取消