二月 21

繼承建構子(Constructor),這看起來既有學問又深奧的文字 

不要怕,以下我問白話文解釋一下 

把繼承建構子分解後,就是 繼承 + 建構子 

繼承,相信有物件導向概念的朋友應該都知道這2個字的意思 

建構子(Constructor),就是用來進行物件初始化的方法 

一般來說,Class B 繼承 Class A 之後就可以使用Class A所開放出來的東西 

那麼如果Class B 繼承 Class A後,想要對Class A進行初始化的動作,那就需要使用繼承建構子了 

先來看看程式吧,看程式就比較不會那麼文謅謅了。程式碼可於這邊下載(C#、VB.NET雙版本)

首先有一個最基本的Class,我們叫它Class A 

C#版本Class A 

class ClassA
{
    public ClassA()
    {
        _InitString = "123";
    }

    public ClassA(string initStr)
    {
        _InitString = initStr;
    }

    private string _InitString;
    public string InitString
    {
        get { return _InitString; }
    }

    public void ShowClassAInit()
    {
        Console.WriteLine(InitString);
        Console.WriteLine("-----------------------------");
    }
}

VB.NET版本Class A 

Class ClassA
    Public Sub New()
        _InitString = "123"
    End Sub

    Public Sub New(ByVal initStr As String)
        _InitString = initStr
    End Sub

    Private _InitString As String
    Public ReadOnly Property InitString() As String
        Get
            Return _InitString
        End Get
    End Property

    Public Sub ShowClassAInit()
        Console.WriteLine(InitString)
        Console.WriteLine("-----------------------------")
    End Sub
End Class

接下來我們需要Class B來繼承Class A 

注意到了嗎,繼承建構子的實作方式就是於Class B加入一個與Class A一樣的初始建構子

並使用base(C#語法)、MyBase.New(VB.NET語法)把初始值帶入Class A。成功於Class B內,進行初始化Class A的動作 

C#版本Class B 

class ClassB : ClassA
{
    public ClassB()
    {        
    }

    public ClassB(string initStr)
        : base(initStr)
    {           
    }        
}

VB.NET版本Class B 

Class ClassB
    Inherits ClassA

    Public Sub New()
    End Sub

    Public Sub New(ByVal initStr As String)
        MyBase.New(initStr)
    End Sub

End Class

接下來就看看怎麼使用,跟使用的結果吧
下面使用Console來DemoC#版本Console 

 

class Program
{
    static void Main(string[] args)
    {
        ClassA CA1 = new ClassA();
        Console.WriteLine("new ClassA()");
        CA1.ShowClassAInit(); //Result:123 

        ClassA CA2 = new ClassA("Init AAA");
        Console.WriteLine("new ClassA(\"Init AAA\")");
        CA2.ShowClassAInit(); //Result:Init AAA 

        ClassB CB1 = new ClassB();
        Console.WriteLine("new ClassB()");
        CB1.ShowClassAInit(); //Result:123 

        ClassB CB2 = new ClassB("Init BBB");
        Console.WriteLine("new ClassB(\"Init BBB\")");
        CB2.ShowClassAInit(); //Result:Init BBB 

        Console.ReadLine();
    }
} 

  

VB.NET版本Console 

 

Module Module1 

    Sub Main()
        Dim CA1 As New ClassA()
        Console.WriteLine("new ClassA()")
        CA1.ShowClassAInit()  'Result:123 

        Dim CA2 As New ClassA("Init AAA")
        Console.WriteLine("new ClassA(""Init AAA"")")
        CA2.ShowClassAInit()  'Result:Init AAA 

        Dim CB1 As New ClassB
        Console.WriteLine("new ClassB()")
        CB1.ShowClassAInit()  'Result:123 

        Dim CB2 As New ClassB("Init BBB")
        Console.WriteLine("new ClassB(""Init BBB"")")
        CB2.ShowClassAInit()  'Result:Init BBB 

        Console.ReadLine() 

    End Sub 

End Module 

執行結果如下圖
20110221_1

以上程式碼可於這邊下載(C#、VB.NET雙版本)





二月 15

之前幫 RouterOS 加上 IP分享器功能(NAT)這篇文章教大家怎麼把RouterOS當成Gateway

讓內部的IP可以透過RouterOS上網

那如果外部的電腦想連到內部電腦的服務(例如:Web、SSH、SQL Server...等)

這時候就需要轉Port的功能(Port Mapping)

實作的方式也很簡單,使用winbox的介面就可以達成了

首先開啟winbox後,IP -> Firewall -> NAT -> 加入一筆新的規則

接下來就看圖操作吧,要注意的是如果你是ADSL撥接上網的,In Interface請選該ADSL的介面

20110215_1

Action的部份則是選dst-nat,IP與Port則是依自已的需求填寫

20110215_2

最後記得把該新建立的規則拉到masquerade的上面

20110215_3