Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: Vài vấn đề về OOP cần giải đáp !

  1. #1
    Ngày gia nhập
    01 2008
    Nơi ở
    UIT
    Bài viết
    129

    Mặc định Vài vấn đề về OOP cần giải đáp !

    Em mới chuyển qua C# đc 2 ngày có vài điều bỡ ngỡ mong các bác giải đáp

    Code:
    public class ABC
    {
      ...
    }
    
    public class Program
    {
      public static void Main(string[] args)
      {
        ...
      }
    }
    Em đã học các thuộc tính truy cập của các thành viên của lớp như public, private, protect, internal ... và đã tiếp thu đc . Nhưng thuộc tính truy cập của class thì sao ? Em thấy các ví dụ lúc thì ghi là "public class" lúc thì chỉ ghi "class" không hiểu có điều gì khác nhau giữa hai cách khai báo ? Và ngoài public ra thì còn có cái gì nữa không ?
    class chính chứa hàm Main() có nhất thiết phải là public ?

    Code:
    public class Father
    {
      public Father(int a, int b)
      {
        ...
      }
    }
    
    public class Son:Father
    {
      public Son(int x, int y, int z):base(int a, int b)
      {
        ...
      }
    }
    Em đang học phần kế thừa. Trong phần này em không hiểu phần hàm khởi tạo của lớp dẫn xuất. Trong sách có ghi về việc hàm khởi tạo của lớp dẫn xuất gọi hàm khởi tạo của lớp cơ sở.
    Không biết khi thực thi kế thừa thì hàm khởi tạo của lớp dẫn xuất có nhất thiết phải gọi hàm khởi tạo của lớp cơ sở hay đó chỉ là một tùy chọn ?

    Vài thắc mắc mong các bác giải đáp ! Em xin cám ơn !

  2. #2
    Ngày gia nhập
    02 2008
    Bài viết
    88

    Đối với class nằm trong namespace bạn chỉ được quyền khai báo dùng public và internal mà thôi.
    Mình từ Caulacbovb qua)
    Giã từ VB6 đến với VB.Net, C# và Java.

  3. #3
    Ngày gia nhập
    01 2008
    Nơi ở
    UIT
    Bài viết
    129

    đó là với các namespace do mình tự tạo ? còn vấn đề thừa kế, ko ai giải thích cho em àh ?

  4. #4
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Theo tớ nghĩ là tùy chọn, vì bạn cũng có thể viết thế này được :
    public Son(int x, int y, int z)
    {
    ...
    }
    Nhưng thực thi kế thừa là để class con sử dụng lại các thuộc tính và phương thức của class cha, nếu ko gọi hàm khởi tạo của class cha thì lại phải viết lại hoàn toàn ở class con?thế thì kế thừa làm gì nữa (không biết ý kiến của tớ có đúng ko ?)
    Cánh Chym ứ mỏi

  5. #5
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Em đã học các thuộc tính truy cập của các thành viên của lớp như public, private, protect, internal ... và đã tiếp thu đc . Nhưng thuộc tính truy cập của class thì sao ? Em thấy các ví dụ lúc thì ghi là "public class" lúc thì chỉ ghi "class" không hiểu có điều gì khác nhau giữa hai cách khai báo ? Và ngoài public ra thì còn có cái gì nữa không ?
    class chính chứa hàm Main() có nhất thiết phải là public ?
    Mức độ truy cập default của class là internal tức là chỉ được sử dụng trong một assembly mà thôi. Khai báo public class thì ta có thể sử dụng class đó trong một assembly khác.

    Ngoài public còn protected, private, seal, ...

    Class Program thích để sao cũng được vì chả ai đụng đến nó cả.

    Em đang học phần kế thừa. Trong phần này em không hiểu phần hàm khởi tạo của lớp dẫn xuất. Trong sách có ghi về việc hàm khởi tạo của lớp dẫn xuất gọi hàm khởi tạo của lớp cơ sở.
    Không biết khi thực thi kế thừa thì hàm khởi tạo của lớp dẫn xuất có nhất thiết phải gọi hàm khởi tạo của lớp cơ sở hay đó chỉ là một tùy chọn ?
    Bạn có thể khởi tạo lại, ko sử dụng constructor của parent class cũng được. Tuy nhiên, hơi phí công ngồi ... gõ lại và làm cho class của bạn kém ... pro :P
    Keep moving forward!

    ... Retired ...

  6. #6
    Ngày gia nhập
    07 2007
    Bài viết
    41

    Mặc định Vài vấn đề về OOP cần giải đáp !

    Trích dẫn Nguyên bản được gửi bởi nhc1987 Xem bài viết
    Bạn có thể khởi tạo lại, ko sử dụng constructor của parent class cũng được. Tuy nhiên, hơi phí công ngồi ... gõ lại và làm cho class của bạn kém ... pro :P
    Ặc , nhc học OOP đến bây giờ mà còn nói câu này.

    Derived class luôn phải gọi lại một constructor nào đó của base class, chỉ có điều bình thường mình nếu không chỉ rõ, và base class có default constructor thì compiler tự gọi đến nó cho mình thôi. Không tin cứ thử loại bỏ default constructor của base class thì biết .

    Nói riêng đối với C#:
    Theo mục 10.11 trong C# 3.0 spec, cú pháp của constructor được định nghĩa như sau (có lẽ được viết dưới dạng EBNF):
    Code:
      	 	 	 	 	 	   constructor-declaration:
    attributesopt   constructor-modifiersopt   constructor-declarator   constructor-body
      constructor-modifiers:
    constructor-modifier
    constructor-modifiers   constructor-modifier
      constructor-modifier:
    public
    protected
    internal
    private
    extern
      constructor-declarator:
    identifier   (   formal-parameter-listopt   )   constructor-initializeropt
      constructor-initializer:
    :   base   (   argument-listopt   )
    :   this   (   argument-listopt   )
      constructor-body:
    block
    ;
    Mục 10.11.1 nói về constructor-initializer:
    All instance constructors (except those for class object) implicitly include an invocation of another instance constructor immediately before the constructor-body. The constructor to implicitly invoke is determined by the constructor-initializer:
    • An instance constructor initializer of the form base(argument-listopt) causes an instance constructor from the direct base class to be invoked. That constructor is selected using argument-list and the overload resolution rules of §7.4.3. The set of candidate instance constructors consists of all accessible instance constructors contained in the direct base class, or the default constructor (§10.11.4), if no instance constructors are declared in the direct base class. If this set is empty, or if a single best instance constructor cannot be identified, a compile-time error occurs.
    • An instance constructor initializer of the form this(argument-listopt) causes an instance constructor from the class itself to be invoked. The constructor is selected using argument-list and the overload resolution rules of §7.4.3. The set of candidate instance constructors consists of all accessible instance constructors declared in the class itself. If this set is empty, or if a single best instance constructor cannot be identified, a compile-time error occurs. If an instance constructor declaration includes a constructor initializer that invokes the constructor itself, a compile-time error occurs.
    If an instance constructor has no constructor initializer, a constructor initializer of the form base() is implicitly provided. Thus, an instance constructor declaration of the form
    C(...) {...}
    is exactly equivalent to
    C(...): base() {...}
    The scope of the parameters given by the formal-parameter-list of an instance constructor declaration includes the constructor initializer of that declaration. Thus, a constructor initializer is permitted to access the parameters of the constructor. For example:
    class A
    {
    public A(int x, int y) {}
    }

    class B: A
    {
    public B(int x, int y): base(x + y, x - y) {}
    }

    An instance constructor initializer cannot access the instance being created. Therefore it is a compile-time error to reference this in an argument expression of the constructor initializer, as is it a compile-time error for an argument expression to reference any instance member through a simple-name.
    Đã được chỉnh sửa lần cuối bởi zxc : 27-07-2008 lúc 10:51 PM.

  7. #7
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Hóa ra là thế, lâu nay vẫn nghĩ nhầm.Nhưng cái này thì không hiểu gì cả
    attributesopt constructor-modifiersopt constructor-declarator constructor-body
    constructor-modifiers:
    constructor-modifier
    constructor-modifiers constructor-modifier
    constructor-modifier:
    public
    protected
    internal
    private
    extern
    constructor-declarator:
    identifier ( formal-parameter-listopt ) constructor-initializeropt
    constructor-initializer:
    : base ( argument-listopt )
    : this ( argument-listopt )
    constructor-body:
    block
    ;
    Cánh Chym ứ mỏi

  8. #8
    Ngày gia nhập
    07 2007
    Bài viết
    41

    Đoạn đó là định nghĩa grammar của constructor, có lẽ được viết theo một context-free grammars notation nào đó, muốn hiểu nó có thể học về BNF notations: http://en.wikipedia.org/wiki/Backus-Naur_form.

    cái đoạn đó copy lên forum cũng khó đọc, nên down C# spec về xem dễ nhìn hơn.

    Giải thích sơ bộ:

    Code:
    constructor-declaration:
    attributesopt   constructor-modifiersopt   constructor-declarator   constructor-body
    Dòng này nói rằng: constructor-declaration có 4 thành phần như nó liệt kê (phân tách nhau bằng whitespace).
    chú ý: các thành phần có đuôi opt (option) là có thể hoặc không có nó. Ví dụ: attributesopt có nghĩa có thể có attributes hoặc không.

    Code:
    constructor-modifiers:
    constructor-modifier
    constructor-modifiers   constructor-modifier
    Đoạn này là một đoạn định nghĩa đệ quy về constructor-modifiers (chú ý số nhiều), nó nói rằng constructor-modifiers có thể chỉ là một constructor-modifier, hoặc là một constructor-modifiers khác theo sau là một constructor-modifier.

    Code:
    constructor-modifier:
    public
    protected
    internal
    private
    extern
    Đoạn này nói rằng một constructor-modifier có thể là một trong 5 keyword trên.
    Một cách tương tự cậu có thể hiểu được định nghĩa trên khi phân tách thành từng đoạn như sau:
    Code:
    constructor-declarator:
    identifier   (   formal-parameter-listopt   )   constructor-initializeropt
    Code:
    constructor-initializer:
    :   base   (   argument-listopt   )
    :   this   (   argument-listopt   )
    Code:
    constructor-body:
    block
    ;
    Đã được chỉnh sửa lần cuối bởi zxc : 28-07-2008 lúc 01:00 AM.

  9. #9
    Ngày gia nhập
    01 2008
    Nơi ở
    UIT
    Bài viết
    129

    ra là vậy !

  10. #10
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Em chả biết gì về mấy cái của bác zxc đưa ra cả. Tiếc ghê.
    Keep moving forward!

    ... Retired ...

Các đề tài tương tự

  1. Cung cấp giấy ik plus, Paper One, Plus A+, Double A, Giấy Thái Lan, Giấy Bãi Bằng, bìa màu, băng dính, mica các loại
    Gửi bởi dungptvietthanh trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 07-06-2013, 04:05 PM
  2. Chung cư Đại Thanh giảm sốc 10tr/vnđ cho các căn hộ. giảm và liên tục giảm…!!
    Gửi bởi lanthanh91 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 09-10-2012, 10:27 AM
  3. Trả lời: 0
    Bài viết cuối: 06-08-2012, 07:01 PM
  4. Trả lời: 0
    Bài viết cuối: 04-08-2012, 03:08 PM
  5. Trả lời: 0
    Bài viết cuối: 24-05-2012, 04:04 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn