C# 寻找设计两个类和一个接口的方法
我想将接口公开到我的表示层 我如何设计上述三个类(2个类和1个接口)以将所有方法公开给我的表示层 所有方法均指:C# 寻找设计两个类和一个接口的方法,c#,asp.net,oop,design-patterns,C#,Asp.net,Oop,Design Patterns,我想将接口公开到我的表示层 我如何设计上述三个类(2个类和1个接口)以将所有方法公开给我的表示层 所有方法均指: 删除() ChangeBucket() 转让许可证() 如果需要更多解释,请询问我 表示层可以是 public interface ISaveData { void DeleteFile(); // this is common method //void ChangeBucket(); I don't need this method in GoogleCl
- 删除()
- ChangeBucket()
- 转让许可证()
public interface ISaveData
{
void DeleteFile(); // this is common method
//void ChangeBucket(); I don't need this method in GoogleCloudSaveFile. Should I remove this from here
// void AssignPermission(); // I don't need of this method in AzureSaveData. Should I remove this from here?
}
public class AzureSaveData : ISaveData
{
void ChangeBucket()
{...}
void DeleteFile()
{...}
}
public class GoogleCloudSaveFile() : ISaveData
{
void AssignPermission()
{...}
void DeleteFile()
{...}
}
ChangeBucket()
和AssignPermission()
只是示例方法。我想说的是,我们的子类可以有两种不同的方法
一种解决方案是,我可以在接口中定义这两种方法,并且可以将方法体中的一种方法保留为空,但我认为这不是一种好的方法,因为我可以根据您提供的信息进行思考,而不必深入到哪个接口中的方法的本质,这是我能想到的最简单的方法:
void Main()
{
ISaveData saveFiles = new GoogleCloudSaveFile(); // This is just example. I will inject this via Dependency Injection framework
saveFiles.Delete();
}
您可以按如下方式使用这些选项:
public interface ISaveData
{
void DeleteFile(); // this is common method
}
public interface IPermission
{
void AssignPermission();
}
public interface IBucketOperation //or something else
{
void ChangeBucket();
}
public class AzureSaveData : ISaveData, IBucketOperation
{
public void ChangeBucket()
{
Console.WriteLine("AzureSaveData ChangeBucket");
}
public void DeleteFile()
{
Console.WriteLine("AzureSaveData DeleteFile");
}
}
public class GoogleCloudSaveFile : ISaveData, IPermission
{
public void AssignPermission()
{
Console.WriteLine("GoogleCloudSaveFile AssignPermission");
}
public void DeleteFile()
{
Console.WriteLine("GoogleCloudSaveFile DeleteFile");
}
}
您还可以检查您创建的对象是否属于类型转换之前的类型:
ISaveData x = new GoogleCloudSaveFile();
x.DeleteFile();
(x as IPermission).AssignPermission();
我不确定您是否愿意采取以下方法,但我认为这会更好:
if(x is IPermission)
(x as IPermission).AssignPermission();
除非您希望忽略设计原则,将所有内容都放在一个接口中,否则您很难使用公共接口,并期望它根据实现为不同类型的对象提供不同的方法。在这种情况下,只需将所有内容放在一个接口中,并在类中实现它,只需执行
public interface IGoogleCloudSaveFile : ISaveData, IPermission { }
public interface IAzureSaveData : ISaveData, IBucketOperation { }
我想我们需要更多的解释。似乎在表示层中,您有一个类可以使用
ISaveData
对象,您希望这些类能够调用changeback()
和AssignPermission()
,因为您希望将这些方法公开给表示层。但是很明显,如果对象类型错误,他们就不能调用这两个方法。目的是什么?您是否有其他机制来确定对象是否是正确的类型,以便知道是否可以调用这些方法。。。我认为我们需要看到更多的图片,而您的问题的最佳答案取决于如何使用此界面。好的,让我解释一下场景。例如我想把文件保存在云上。我的表示层不知道后端使用的是哪台云服务器。可能我需要在上面的设计中再引入一个接口或抽象类来实现这一点。意味着需要重新设计上述解决方案。我将更新这个问题。如果您的表示层不知道正在使用哪个云服务器,那么为什么表示层需要使用ChangeBucket()
或AssignPermission()
,因为这些方法似乎是特定于一个或另一个云服务器的?如果它不需要使用这些,那么就不需要在接口中公开它们。我认为您的方法DeleteFile()不属于ISaveData,或者您可能应该更改接口本身的名称。此外,就这一点而言,ChangeBucket()和AssignPermission方法似乎不属于单一接口。您可以使用多个接口。ISaveData x=new GoogleCloudSaveFile();x、 AssignPermission();//如果我使用您上面提到的方法,我认为“AssignPermission()”方法将不可用。如果我错了,请纠正我。谈论代码“x.AssignPermission();”的第二行
throw new NotImplementedException();