当接口方法参数是抽象的时,避免类型检查

时间:2015-06-12 09:21:34

标签: c# oop interface

我的界面如下所示:

public interface UserHandler
{
    CheckUsernameResponse CheckUsername(CheckUsernameRequest request);
}

签名中的请求和响应类型是抽象类,使用类似于:

的用法
var fooHandler = new FooUserHandler();

var fooResponse = fooHandler.CheckUsername( new FooRequest { id = 1, FooProperty = "abc" });

var barHandler = new BarUserHandler();

var barResponse = barHandler.CheckUserName( new BarRequest { id = 2, BarProperty = true });

我最终要做的是能够拥有多个UserHandler实现,每个实现都有自己版本的请求/响应类型,具有不同的属性但具有共同的基本类型。我这样做是为了避免在外部用户提供程序发生更改并且新提供程序在方法调用中需要不同属性时必须对使用的WCF服务进行更改。

请记住,可以传递从抽象类继承的任何类型,即我可以将BarRequest传递给FooHandler,如何确保只将正确/期望的类型作为参数传递给不依赖于:

public CheckUsernameResponse CheckUsername(CheckUsernameRequest request)

    if (request.GetType() != typeOf(FooRequest))
        throw new ArgumentException("Wrong type!");

    var fooRequest = request as FooRequest;

这感觉不对,所以我很欣赏对具体问题和方法的任何反馈。

我真正想要的是方法签名:

public FooResponse CheckUsername(FooRequest request)

但如果我这样做,我就没有实现界面。

1 个答案:

答案 0 :(得分:2)

在我看来,界面应该使用泛型,所以你可以依赖界面的实现。

我会建议这样的事情:

+ (MyClass*) sharedInstance {
    static MyClass *_sharedInstance = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        _sharedInstance = [[MyClass alloc] init];
    });
    return _sharedInstance;
}

- (instancetype)init{
    self = [super init];
    if (self) {
        //setup code
    }
    return self;
}

然后public interface UserHandler<TRequest, TResponse> where TRequest : CheckUsernameRequest where TResponse : CheckUsernameResponse { } 将成为:

FooHandler

现在你已经完成了设置,你不必再检查类型了。你是安全的编译器。