C# 寻找设计两个类和一个接口的方法

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

我想将接口公开到我的表示层

我如何设计上述三个类(2个类和1个接口)以将所有方法公开给我的表示层

所有方法均指:

  • 删除()
  • 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();