当前位置:  开发笔记 > 编程语言 > 正文

如何定义必须由类实例实现的函数的签名?

如何解决《如何定义必须由类实例实现的函数的签名?》经验,为你挑选了1个好方法。

说我有一节课Book:

public class Book{
   public string Title {get; set;}
}

我希望每本书都有一个Read返回字符串并接受页码的函数 - 但每本书的内部结构都不同(我知道这个例子很糟糕).如何定义必须由此类实例实现的函数的签名?

像这样的东西:

public class Book{ // need to make this abstract?
   public string Title {get; set;}
   public abstract string Read(int pageNum);
}

// I want to define instances that define their own behavior...
public static Book It => new Book(){ // can't create instance of abstract...
   Title = "It", 
   Read... // what do I do here?
}

我主要担心的是:

保持事情尽可能简单.在抽象类下实现接口是有效的,但是当我添加更多实例时,它给我带来了n*2件事情.

我将需要添加大量这些自定义函数 - 通过构造函数传递Func似乎很笨拙.

在实践中 - 这用于定义a Tenant.将Tenants在内存中的定义,并且有很多的静态属性,如domain,name,adminEmail,等这些都是承租人专用的属性...但现在我想实现租户特定的行为 -样GetBooksFilterUsers.我希望尽可能简单地实现实现.现在我有"如果TenantA,这样做,否则如果是tenantB,那么......"在我的代码中撒了一遍.我正在尝试在一个地方合并所有特定于租户的逻辑和细节 - 在Tenant类的实例上.

租户特定行为的更多示例 - 您有一个SaaS论坛软件.在论坛A的主页上,您可以GetCoverPhoto通过读取静态文件.在论坛B的主页上,您可以GetCoverPhoto通过博客主页阅读.目前,我说"如果是论坛A,请这样做,否则如果论坛B,就这样做".这是我想要在Tenant对象上而不是在代码中定义的特定于租户的行为类型.我不希望在我的核心逻辑中有任何特定于租户的代码.

C#语言中是否有一个简单的功能/模式可以实现这一目标?



1> Łukasz Rozme..:

NineBerry所说的非常有效.

还有另外一种方法可以完成你想要的东西.如果要将read方法实现动态地注入Book中.这可以看作是战略模式.并且可以像许多语言一样以接口的形式完成,但在C#中最简单的形式可以由代表完成.例:

public class Book{
   Func readFunc;
   public Book(Func readFunc)
   {
     this.readFunc = readFunc;
   }
   public string Title {get; set;}
   public string Read(int pageNum) { return readFunc(pageNum); }
}

然后用它作为:

public static Book It => new Book(){
   Title = "It", 
   Read = (pageNum) => ... // Do actual reading in delegate
}

编辑:有关要求的更多细节(但仍然不是一切都很明显)我会做这样的事情:

public class Tenant 
{
  // core things go here
  public Extensions Extensions { get; }
}

public class Extensions : IEnumerable
{
  private IList list = new List

用法:

Tenant tenant; // initialized somehow
var coverPhotoExtension = tenant.Extensions.FirstOrDefault();
Photo photo = coverPhotoExtension?.GetCoverPhoto();

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有