如果我有像这样的服务器接口...
interface IServer
{
void Login();
void Post();
void Get();
}
Run Code Online (Sandbox Code Playgroud)
...... 除非你先做,否则在哪里工作Post和Get不工作Login.它是否是对封装的语义违反,因为它使得您对接口的使用隐含地依赖于实现?你会怎么解决它?
The*_*eHe 10
我的想法:
interface IServer
{
ISession Authenticate();
}
interface ISession
{
IServer Server{get;}
void Post();
void Get();
}
Run Code Online (Sandbox Code Playgroud)
如果您可以接触"泥",请忽略它:
[泥]
澄清这一点:imho你必须考虑软件设计,因为你会创建一个产品...你真的想要一个安全的所有有价值的东西,你可以按下"打开"按钮而不是FIRST输入代码吗?这只是你用例的类比......
一个实现者可以在他验证之前调用post并获取...
另一种广泛使用的方法是访问令牌,并在此处使用它:'
interface IServer {//返回所需的令牌字符串Authenticate(); void Post(字符串标记); void Get(string token); }
但我想,那也是错的......
您可以看到并且可能调用方法,在登录之前您不允许查看/调用...如果实现者只是不检查"令牌"是否正确,那么您在此处存在安全风险...
如果将逻辑划分为多个层(guest/unauthenticated,authenticated/session和(例如)adminsession),您可以获得清晰的逻辑分离和更多的语义有用性....
我个人编写代码EVER,好的框架构建器会编写代码......它具有可重用性,即使经过多年,也非常容易和清晰.
[/泥]
C#中的接口只是一个确保某些属性(方法的存在)的正式合同.它没有捕获开发人员想到的完整语义合约.在这种意义上,使用接口永远不会保证调用者可以调用他想要的任何方法.
任何方法都是如此File.WriteAllText(path, text).即使正式接口允许,也不能只传入null作为路径.记录在案的强制运行时合同会阻止您这样做.
回到你的代码:调用者不依赖于接口的实现.他取决于它的合同(在C#中没有说明).