2017-03-16 68 views
0

我必须实现类将文件传输到USB(class USBTransfer)和通过FTP(class FTPTransfer)。因为这两个类都使用了一些常用的方法(如获取文件名,读取一些参数等),所以我在另一个类中实现了这些方法(class FileOperations)。我继承了class FileOperations这两个类(即class USBTransferclass FTPTransfer)。在C#中的多继承的解决方法

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; 

我想,以减少冗余并要强制有相同的变量/方法(嗯......接口可以实现相同的方法)。

问题PART-2:我上面提到的,但无论是传输操作有像IdleStateFileCopyingStateSuccessfullyCopiedState一些常见的状态具有其相应的方法(即IdleState()FileCopyingState()SuccessfullyCopiedState())文件传输到USB或FTP 。我想要实现这些方法的两个类(即IdleState(),FileCopyingState()SuccessfullyCopiedState())。如果任何类忘记实现任何方法,那么我应该得到一个编译器错误。基本上,FileTransferStateMachine应该是一个接口/抽象类,它的方法应该在USBTransferFTPTransfer类(它们已经继承另一个称为FileOperations的类)中被覆盖。

+3

为什么在这里使用'static'?另外为什么'FileTransferStates'是一个嵌套类型?删除这些东西,并将它变成一个界面,在层次结构链中添加另一层。 – Igor

+0

'FileTransferStates'是'static',因为这个变量是在另一个类中读取的,并且声明它是静态的,所以我不需要有一个对象来访问另一个类中的变量。 – skm

+4

“...是静态的,因为这个变量是在另一个类中读取的”:ouch。 –

回答

3

使用的组合物(和避免static状态成员):

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

    protected FileTransferStateMachine Statemachine { get; set; } 
} 

编辑,关于第2部分:

当你想强制的具体类来实现每个这样的方法,那么接口IFileTransferStateMachine是完全正确的。

你也可以得到FileOperations从的StateMachine:
abstract class FileOperations: FileTransferStateMachine { }

,但我会用一个接口,它可以应用于更精细。

+0

如果我将'FileTransferStateMachine Statemachine'声明为受保护的(而不是静态的),那么如何在另一个类中读取此变量的值(该类正在读取值并发布有关状态的相应消息)。 – skm

+0

“受保护”级别只是我的猜测,使其公开。但是你不应该需要'static',并且当两个文件操作同时运行时你不能使用它。 –

+0

谢谢,大家都说这里不应该使用'static'。请您在这种情况下添加一些关于使用'static'的负面影响的观点。 – skm

0

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

  • FileTransferStates可以移出类,直接在命名空间中放置的(可能是在它自己的文件)。然后,它可以通过两个实现而不被重新定义

  • CurrentState可以由非静态属性(未字段)被使用。属性可以放在一个接口上,所以它们不需要抽象类。无论如何都强烈建议公共会员的属性,正如其他人所说的那样,静态在这里是不合适的。

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