2017-05-31 71 views
1

我不確定這是否有意義,因此廣泛詢問。 是否有可能強制執行一組類總是實現一個給定名稱的功能。每個類中的方法可能具有不同的簽名 - 但應該具有相同的名稱。下面的一些喜歡:C#執行所有類的方法都有一個給定名稱的方法

public class ClassOne { 
    public int GetSomething (int a, int b, out int c) { } 
} 

public class ClassTwo { 
    public int GetSomething (int a, out string b) {} 
} 

我想任何人誰寫ClassThreeClassFour,因爲這個庫的一部分來實現GetSomething方法。是否有一個C#構造允許執行此操作?

沒有看這個設計審查 - 只是想知道它的可能性,而不需要通過代碼審查手動執行。

+2

使用接口! – Wheels73

+0

爲什麼不實現這麼多的接口這是接口隔離原理 –

+2

爲什麼你需要這個呢?爲什麼你想要一個可以做任何事情的方法的普通名字,並且可能還會返回任何內容?如果你想強制所有的類都有一個給定的成員使該成員在基類中抽象出來。然而,這隻有在簽名和API總是相同時纔有意義, – HimBromBeere

回答

6

您不能使用開箱即用的C#來完成此操作。 C#具有抽象類和接口,但它們需要一個方法的特定簽名,而不僅僅是一個名稱。

您可以通過創建code analyzers in Roslyn來獲得此工作,您可以在其中檢查代碼是否具有所需的方法。

不過,我認爲你不應該這樣。我認爲你在這裏需要一個具有特定名稱的方法,而不會強制它的論點。

您可以始終實現類似於每個C#應用程序中的Main方法的方法。它使用一個string[]作爲參數,您可以放入多個變量。在您的情況下,我會選擇object[]。但是,這種設計的缺陷顯然太明顯了。

0
  1. 用你想要的方法添加一個接口。
  2. 集類從該interace

    接口ISampleInterface { 空隙SampleMethod()繼承; }

    class ImplementationClass1 : ISampleInterface 
    { 
        // Explicit interface member implementation: 
        void ISampleInterface.SampleMethod() 
        { 
         // Method implementation. 
        } 
    

    }

0

什麼是未知參數方法的類的目的。這在OOP方面只是不合邏輯的。你打算怎麼稱呼這種方法?如果參數是同質的,那麼你可能只是這樣做:

public interface IBaseInterface 
{ 
    public int GetSomething(Dictionary<string, object> args); // keys matter 
} 

public interface IBaseInterface 
{ 
    public int GetSomething(params object[] args); // order matters 
} 

在某些情況下Func<>/Action<>高階功能可能是有用的。
如果您提供使用案例,我們將能夠做出更準確的答案。 顯示你如何打電話給這樣的方法,我會盡力展示如何讓它變得更好。

僅從技術邊回答你的問題,你可以做到以下幾點:

public abstract class BaseClass 
{ 
    protected BaseClass() 
    { 
     if (this.GetType().GetMethod("GetSomething") == null) 
      throw new InvalidOperationException("BaseClass subclasses should implement 'GetSomething' method"); 
    } 
} 

public class ClassOne : BaseClass { 
    public int GetSomething (int a, int b, out int c) { } 
} 

public class ClassTwo : BaseClass { 
    public int GetSomething (int a, out string b) {} 
} 

不會保證這種行爲在設計時,還要保證這些方法存在於運行時間

0

如何將參數封裝在「Criteria」對象中?

public interface IGettable 
{ 
    int GetSomething (Criteria crit); 
} 

public class Criteria 
{ 
    public CriteriaType type {get; set;}; 
    public int a {get; set;}; 
    public int b {get; set;}; 
    ... 

    public static Criteria ClassOneCriteria(int a, int b) 
    { 
     return new Criteria 
     { 
      type = CriteriaType.ClassOneCriteria, 
      a = a, 
      b = b 
     } 
    } 
    ... 
} 

public enum CriteriaType 
{ 
    ClassOneCriteria, 
    ClassTwoCriteria 
} 

public class ClassOne : IGettable 
{ 
    public int GetSomething (Criteria crit) 
    { 
     if (crit.type != CriteriaType.ClassOneCriteria) 
      throw new Exception("Invalid criteria type for Class One"); 
     ... 
    } 
} 
相關問題