C#

时间:2017-03-16 13:16:26

标签: c# inheritance

我必须实现类以将文件传输到USB(class USBTransfer)和FTP(class FTPTransfer)。由于这两个类都使用了一些常用方法(比如获取文件名,读取一些参数等),所以,我已经在另一个类(class FileOperations)中实现了这些方法。我从class USBTransfer继承了这两个类(即class FTPTransferclass FileOperations)。

class FileOperations
{
    protected void CommonMethod1();
    protected void CommonMethod2();
}

class USBTransfer : FileOperations
{ 

}

class FTPTransfer : FileOperations
{

}

问题:在文件传输操作期间,我设置了不同的状态(尽管不使用状态机设计模式)。我想为此目的使用 ABSTRACT 类,具有以下结构。

abstract class FileTransferStateMachine
{
    //Public
    public enum FileTransferStates { Idle = 0, FileCopyingState = 1, SuccessfullyCopiedState = 2 }
    public static FileTransferStates CurrentState = FileTransferStates.Idle;

    abstract protected void IdleState();
    abstract protected void FileCopyingState();
    abstract protected void SuccessfullyCopiedState();
}

但是在C#中不允许有多重继承。

问题:我知道我可以使用界面。但是你不能有变量,在这种情况下我的两个类(即class USBTransferclass FTPTransfer)都有自己的变量用于以下

public enum FileTransferStates { Idle = 0, FileCopyingState = 1, SuccessfullyCopiedState = 2 }
public static FileTransferStates CurrentState = FileTransferStates.Idle;

我想减少冗余,并希望强制为状态机强制使用相同的变量/方法(嗯......接口可以实现相同的方法)。

问题第2部分:如上所述,我可以将文件传输到USB或FTP,但传输操作都有一些常见状态,如IdleStateFileCopyingState或{{ 1}}有相应的方法(即SuccessfullyCopiedStateIdleState()FileCopyingState())。我想 FORCE 两个类来实现这些方法(即SuccessfullyCopiedState()IdleState()FileCopyingState())。如果任何类忘记实现任何方法,那么我应该得到编译器错误。基本上,SuccessfullyCopiedState()应该是一个接口/抽象类,其方法应该在FileTransferStateMachineUSBTransfer类中重写(它们已经继承了另一个名为FTPTransfer的类。)

2 个答案:

答案 0 :(得分:3)

使用组合(并避免static州成员):

abstract class FileOperations
{
    protected void CommonMethod1();
    protected void CommonMethod2();

    protected FileTransferStateMachine Statemachine { get; set; }
}

编辑,关于第2部分:

如果要强制具体类实现每个方法,那么接口IFileTransferStateMachine是完全正确的。

您还可以从StateMachine派生FileOperations:
abstract class FileOperations: FileTransferStateMachine { }

但我会使用一个界面,它可以更精细地应用。

答案 1 :(得分:0)

解决你说的两个部分是一个问题:

  • FileTransferStates可以移出类,直接放在命名空间中(可能在自己的文件中)。然后它可以被两种实现使用而无需重新定义

  • CurrentState可以设为非静态属性(非字段)。属性可以放在接口上,因此它们不需要抽象类。无论如何,强烈建议在公共成员的字段上使用属性,正如其他人所说,静态不适合这里。

正如其他人所提到的,另一个选择是使用这两个类中的一个作为依赖而不是基类。即使用组合而不是继承。