簡體   English   中英

“產品”中的抽象方法-工廠方法C#

[英]Abstract Methods in “Product” - Factory Method C#

我有一個簡單的用C#編寫的類庫(COM +服務),使用了5種Web服務:加,減,除,乘和比較。

我已經創建了抽象產品和抽象工廠類。 抽象產品命名為WS的代碼:

public abstract class WS
{

    public abstract double Calculate(double a, double b);

    public abstract string Compare(double a, double b);
}  

如您所見,當其中一個子類繼承WS時,必須重寫兩個方法,這在某些子類中可能沒有用。 doesn't need Calculate() method. 例如, 不需要Calculate()方法。

為了實例化一個新的CompareWS對象,客戶端類將調用CreateWS()方法,該方法返回WS對象類型。

public class CompareWSFactory : WSFactory
{
    public override WS CreateWS()
    {
        return new CompareWS();
    }
}

但是,如果在WS中未定義Compare(),則不能調用Compare()方法。 這是因為客戶端將使用WS類型的對象,而不是CompareWS對象。

這只是具有兩種方法的示例,但是如果有更多方法該怎么辦? 在WS類中將所有方法都定義為抽象方法是愚蠢的嗎?

我的問題是:我想定義WS所有子類都通用的抽象方法,而當工廠創建WS對象類型時,可以調用所有子類的方法(WS的重寫方法以及子類中的方法)。 我應該怎么做?

您可以聲明WS類中所有子類共有的所有方法,但是您應該僅抽象化那些將在派生類中更改實現的方法。 將“ Compare方法設為“抽象”沒有意義。 為什么說不能調用這種方法?

您總是可以在一個類中擁有抽象和非抽象方法,並且您的Compare方法看起來不需要抽象。

在里賈納,抽象類可以定義抽象方法和虛擬方法。 虛方法將在基類中包含一些默認實現,但可以根據需要由派生類覆蓋:

    public abstract class WS
{

    // All derived classes will have to implement this
    public abstract double Calculate(double a, double b);

    // This can be overriden by derived classes (since it's a virtual method)
    public virtual string Compare(double a, double b)
    {
        // Some default implementation.
        // Any derived classes can override this implementation if they want
    }
}  

如果您的類繼承自抽象類,並且沒有為所有抽象方法提供主體,則該類也將變為抽象。 解決此問題的一種方法是使用接口而不是類!

interface ICalculate
{
   double Calculate(double a, double b);
}
interface ICompare
{
   string Compare(double a, double b);
}
class Compare : ICompare
{
   public double ICompare.Compare(double a, double b) { .... }
}
class CompareAndCalculate : ICompare, ICalculate
{
   public string ICompare.Compare(double a, double b) { .... }
   public double ICalculate.Calculate(double a, double b) {...}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM